package work;
import java.math.BigInteger;
import java.text.DecimalFormat;
public class BatteryCurrent {
public static void main(String[] args) {
/*情况一 电总协议
* 协议中可以获取正电池电流和负电池电流(APM30-300)或者只获取一个电池电流(UL33)
* 正常情况下使用getDecodeMessageStr4LHLH方法解析电池电流是可以,但是放电时使用该方法解析会与实际数据有差距
* 通过测试发现需要把返回的数据进行翻转后再解析
* 例如返回的数据为1F856BC1 这需要翻转为 C16B851F 后在进行解析
* 且
* */
String a = "C16B851F";
System.out.println(Float.intBitsToFloat(new BigInteger(a,16).intValue()));
/*情况二 MODBUS协议
* 电池放电时解析出来的数据比较大
*正常情况下使用getDecodeMessageDouble2HL方法进行解析电池电流是可以,但是放电时使用该方法解析会与实际数据有差距
*发现需要使用getDecodeMessageString2HL方法进行解析
* */
byte[] messageRep = new byte[]{(byte)0xff,(byte)0xed};
double BETI = Double.parseDouble(getDecodeMessageString2HL(messageRep, 0, "0"));
System.out.println(BETI);
}
/**
* IEEE754方式计算,只包含整数
* HEX-ASCII码后传输,4个字节转换成ASCII码后传输,即传输8个字节,接收到的8个字节在转成16进制字符串,每8位表示一个值(8位即可看成4个字节)
* 传出方式是:<font style='color: red'>先低字后高字,先低字节后高字节。</font><br>
* @param b 返回数据
* @param t 开始取值点
* @return
*/
public String getDecodeMessageStr4LHLH(String b, int t) {
int val=0;
String messageF = b.substring(t, t+8);
String s1 = messageF.substring(6, 8);
String s2 = messageF.substring(4, 6);
String s3 = messageF.substring(2, 4);
String s4 = messageF.substring(0, 2);
messageF = s1 + s2 + s3 + s4;
try{
val=Integer.valueOf(messageF, 16);
}catch (Exception e) {
try{
if(Integer.valueOf(s1, 16)>127)s1="40";
}catch (Exception e1) {
s1="00";
}
try{
Integer.valueOf(s2, 16);
}catch (Exception e1) {
s2="00";
}
try{
Integer.valueOf(s3, 16);
}catch (Exception e1) {
s3="00";
}
try{
Integer.valueOf(s4, 16);
}catch (Exception e1) {
s4="00";
}
messageF = s1 + s2 + s3 + s4;
val=Integer.valueOf(messageF, 16);
}
DecimalFormat dformat = new DecimalFormat("0.00");
return dformat.format(Float.intBitsToFloat(val));
}
public static String getDecodeMessageString2HL(byte[] message, int suffix, String v) {
try {
byte[] b = new byte[2];
System.arraycopy(message,suffix,b,0,2);
String is= String.valueOf((Integer.valueOf(bytesToHexString(b), 16).shortValue()));
return is;
} catch (Exception e) {
}
return v;
}
public static String bytesToHexString(byte[] src){
StringBuilder stringBuilder = new StringBuilder("");
if (src == null || src.length <= 0) {
return null;
}
for (int i = 0; i < src.length; i++) {
int v = src[i] & 0xFF;
String hv = Integer.toHexString(v);
if (hv.length() < 2) {
stringBuilder.append(0);
}
stringBuilder.append(hv);
}
return stringBuilder.toString();
}
}