例1000:某bms串口协议-主动解析样例工程
字节 |
说明 |
备注 |
---|---|---|
Data0 |
0xaa |
固定帧头 |
Data1 |
0x55 |
固定帧头 |
Data2 |
0xaa |
固定帧头 |
Data3 |
0xff |
固定帧头 |
Data4 |
总压高字节 |
0.1V/bit |
Data5 |
总压低字节 |
|
Data6 |
单体电压0高字节 |
1mV/bit |
Data7 |
单体电压0低字节 |
|
Data8 |
单体电压1高字节 |
1mV/bit |
Data9 |
单体电压1低字节 |
|
Data10 |
单体电压2高字节 |
1mV/bit |
Data11 |
单体电压2低字节 |
|
Data12 |
单体电压3高字节 |
1mV/bit |
Data13 |
单体电压3低字节 |
|
Data14 |
单体电压4高字节 |
1mV/bit |
Data15 |
单体电压4低字节 |
|
Data16 |
单体电压5高字节 |
1mV/bit |
Data17 |
单体电压5低字节 |
|
Data18 |
单体电压6高字节 |
1mV/bit |
Data19 |
单体电压6低字节 |
|
Data20 |
单体电压7高字节 |
1mV/bit |
Data21 |
单体电压7低字节 |
|
Data22 |
单体电压8高字节 |
1mV/bit |
Data23 |
单体电压8低字节 |
|
Data24 |
单体电压9高字节 |
1mV/bit |
Data25 |
单体电压9低字节 |
|
Data26 |
单体电压10高字节 |
1mV/bit |
Data27 |
单体电压10低字节 |
|
Data28 |
单体电压11高字节 |
1mV/bit |
Data29 |
单体电压11低字节 |
|
Data30 |
单体电压12高字节 |
1mV/bit |
Data31 |
单体电压12低字节 |
|
Data32 |
单体电压13高字节 |
1mV/bit |
Data33 |
单体电压13低字节 |
|
Data34 |
单体电压14高字节 |
1mV/bit |
Data35 |
单体电压14低字节 |
|
Data36 |
单体电压15高字节 |
1mV/bit |
Data37 |
单体电压15低字节 |
|
Data38 |
单体电压16高字节 |
1mV/bit |
Data39 |
单体电压16低字节 |
|
Data40 |
单体电压17高字节 |
1mV/bit |
Data41 |
单体电压17低字节 |
|
Data42 |
单体电压18高字节 |
1mV/bit |
Data43 |
单体电压18低字节 |
|
Data44 |
单体电压19高字节 |
1mV/bit |
Data45 |
单体电压19低字节 |
|
Data46 |
单体电压20高字节 |
1mV/bit |
Data47 |
单体电压20低字节 |
|
Data48 |
单体电压21高字节 |
1mV/bit |
Data49 |
单体电压21低字节 |
|
Data50 |
单体电压22高字节 |
1mV/bit |
Data51 |
单体电压22低字节 |
|
Data52 |
单体电压23高字节 |
1mV/bit |
Data53 |
单体电压23低字节 |
|
Data54 |
单体电压24高字节 |
1mV/bit |
Data55 |
单体电压24低字节 |
|
Data56 |
单体电压25高字节 |
1mV/bit |
Data57 |
单体电压25低字节 |
|
Data58 |
单体电压26高字节 |
1mV/bit |
Data59 |
单体电压26低字节 |
|
Data60 |
单体电压27高字节 |
1mV/bit |
Data61 |
单体电压27低字节 |
|
Data62 |
单体电压28高字节 |
1mV/bit |
Data63 |
单体电压28低字节 |
|
Data64 |
单体电压29高字节 |
1mV/bit |
Data65 |
单体电压29低字节 |
|
Data66 |
单体电压30高字节 |
1mV/bit |
Data67 |
单体电压30低字节 |
|
Data68 |
单体电压31高字节 |
1mV/bit |
Data69 |
单体电压31低字节 |
|
Data70 |
reserved |
保留参数 |
Data71 |
reserved |
保留参数 |
Data72 |
电流高字节 |
0.1A/bit integer |
Data73 |
电流低字节 |
|
Data74 |
SOC |
1%/bit |
Data75 |
byte3 |
物理容量 备注5 |
Data76 |
byte2 |
|
Data77 |
byte1 |
|
Data78 |
byte0 |
|
Data79 |
byte3 |
剩余容量 备注5 |
Data80 |
byte2 |
|
Data81 |
byte1 |
|
Data82 |
byte0 |
|
Data83 |
byte3 |
循环容量 备注5 |
Data84 |
byte2 |
|
Data85 |
byte1 |
|
Data86 |
byte0 |
|
Data87 |
byte3 |
系统时间 1s/bit |
Data88 |
byte2 |
|
Data89 |
byte1 |
|
Data90 |
byte0 |
|
Data91 |
MOS 温度高字节 |
1 ℃/bit integer |
Data92 |
MOS 温度低字节 |
|
Data93 |
均衡温度高字节 |
1 ℃/bit integer |
Data94 |
均衡温度低字节 |
|
Data95 |
外部温度0高字节 |
1 ℃/bit integer |
Data96 |
外部温度0低字节 |
|
Data97 |
外部温度1高字节 |
1 ℃/bit integer |
Data98 |
外部温度1低字节 |
|
Data99 |
外部温度2高字节 |
1 ℃/bit integer |
Data100 |
外部温度2低字节 |
|
Data101 |
外部温度3高字节 |
1 ℃/bit integer |
Data102 |
外部温度3低字节 |
|
Data103 |
充电MOS状态 |
备注1 |
Data104 |
放电MOS状态 |
备注2 |
Data105 |
均衡状态 |
备注3 |
Data106 |
reserved |
保留参数 |
Data107 |
reserved |
保留参数 |
Data108 |
reserved |
保留参数 |
Data109 |
reserved |
保留参数 |
Data110 |
reserved |
保留参数 |
Data111 |
reserved |
保留参数 |
Data112 |
reserved |
保留参数 |
Data113 |
reserved |
保留参数 |
Data114 |
reserved |
保留参数 |
Data115 |
最高单体串数 |
|
Data116 |
最高单体电压高字节 |
1mV/bit |
Data117 |
最高单体电压低字节 |
|
Data118 |
最低单体串数 |
|
Data119 |
最低单体电压高字节 |
1mV/bit |
Data120 |
最低单体电压低字节 |
|
Data121 |
平均单体电压高字节 |
1mV/bit |
Data122 |
平均单体电压低字节 |
|
Data123 |
实际串数 |
|
Data124 |
reserved |
保留参数 |
Data125 |
reserved |
保留参数 |
Data126 |
reserved |
保留参数 |
Data127 |
reserved |
保留参数 |
Data128 |
reserved |
保留参数 |
Data129 |
reserved |
保留参数 |
Data130 |
reserved |
保留参数 |
Data131 |
reserved |
保留参数 |
Data132 |
reserved |
保留参数 |
Data133 |
reserved |
保留参数 |
Data134 |
reserved |
保留参数 |
Data135 |
reserved |
保留参数 |
Data136 |
系统日志高字节 |
备注6 |
Data137 |
系统日志低字节 |
|
Data138 |
校验和高字节 |
备注4 |
Data139 |
校验和低字节 |
数值 |
说明 |
---|---|
0 |
关闭 |
1 |
打开 |
2 |
单体过压 |
3 |
过流 |
4 |
|
5 |
总压过压 |
6 |
电池过温 |
7 |
功率过温 |
8 |
电流异常 |
9 |
均衡线掉串 |
10 |
主板过温 |
11 |
|
12 |
开启失败 |
13 |
充电管异常 |
14 |
等待 |
15 |
手动关闭 |
16 |
二级过压 |
17 |
低温保护 |
18 |
压差保护 |
19 |
|
20 |
|
21 |
|
22 |
总压单体异常 |
数值 |
说明 |
---|---|
0 |
关闭 |
1 |
打开 |
2 |
单体欠压 |
3 |
过流 |
4 |
二级过流 |
5 |
总压欠压 |
6 |
电池过温 |
7 |
功率过温 |
8 |
电流异常 |
9 |
均衡线掉串 |
10 |
主板过温 |
11 |
|
12 |
短路保护 |
13 |
放电管异常 |
14 |
开启失败 |
15 |
手动关闭 |
16 |
耳机欠压 |
17 |
低温保护 |
18 |
压差保护 |
19 |
|
20 |
|
21 |
|
22 |
总压单体异常 |
数值 |
说明 |
---|---|
0 |
关闭 |
1 |
均衡极限 |
2 |
压差均衡 |
3 |
均衡过温 |
4 |
自动均衡 |
10 |
主板过温 |
备注4:
和校验计算方法:
定义一个16bit变量
u16Result=0
u16Result += Data[I], I 从 4 到 137.如果 u16Result = Data[138]*256+Data[139]. 那么数据是完整的,否则数据是错误的。
备注5:
对于4字节变量 结果 = byte3 << 24 + byte2 << 16 + byte1 << 8 + byte0
容量的分辨率为0.000001AH
数值 |
说明 |
---|---|
bit0 - bit4 |
充电放电管状态 |
bit5 - bit9位 |
电池编号 |
bit10 - bit14位 |
先后顺序 |
bit15 |
充电放电,1放电,0充电 |
注意
每个页面仅建议在一个定时器中读取串口缓冲区的数据,在多个定时器中读取串口缓冲区的数据容易照成逻辑混乱。
新建一个空白工程
在工程中新建一个定时器tmDecode,tim设置为50,en设置为1,用于定时解析串口数据
注意
16进制发送时,可以忽略大小写,ff和FF是一样的,AA和aa是一样的,但是请不要写成Ff,Ab这样大小写混用
program.s中的配置如图所示
//以下代码只在上电时运行一次,一般用于全局变量定义和上电初始化数据
//全局变量定义目前仅支持4字节有符号整形(int),不支持其他类型的全局变量声明,如需使用字符串类型可以在页面中使用变量控件来实现
int sys0=0,sys1=0,sys2=0
//frameLength:每帧数据长度
//getFrameFlag:是否找到帧头或帧尾标记
int frameLength=140,getFrameFlag
int sumCheck=0,sumCheck2=0
bauds=19200 //波特率19200
recmod=1 //打开主动解析
page 0 //上电刷新第0页
解析定时器(tim为50)中的代码如下图所示
while(usize>=frameLength&&getFrameFlag==0)
{
//计算校验和
sumCheck=0
for(sys0=4;sys0<=137;sys0++)
{
sumCheck+=u[sys0]
}
sumCheck&=0xffff
sumCheck2=u[138]<<8+u[139]
//检查帧头和校验和
if(u[0]==0xAA&&u[1]==0x55&&u[2]==0xAA&&u[3]==0xFF&&sumCheck==sumCheck2)
{
//找到帧头,退出循环
getFrameFlag=1
}else
{
//如果帧头不对,就一直删除1个字节,直到不满足条件退出循环
udelete 1
}
}
if(getFrameFlag==1)
{
global.data4_5.val=u[4]<<8+u[5]
global.data6_7.val=u[6]<<8+u[7]
global.data8_9.val=u[8]<<8+u[9]
global.data10_11.val=u[10]<<8+u[11]
global.data12_13.val=u[12]<<8+u[13]
global.data14_15.val=u[14]<<8+u[15]
global.data16_17.val=u[16]<<8+u[17]
global.data18_19.val=u[18]<<8+u[19]
global.data20_21.val=u[20]<<8+u[21]
global.data22_23.val=u[22]<<8+u[23]
global.data24_25.val=u[24]<<8+u[25]
global.data26_27.val=u[26]<<8+u[27]
global.data28_29.val=u[28]<<8+u[29]
global.data30_31.val=u[30]<<8+u[31]
global.data32_33.val=u[32]<<8+u[33]
global.data34_35.val=u[34]<<8+u[35]
global.data36_37.val=u[36]<<8+u[37]
global.data38_39.val=u[38]<<8+u[39]
global.data40_41.val=u[40]<<8+u[41]
global.data42_43.val=u[42]<<8+u[43]
global.data44_45.val=u[44]<<8+u[45]
global.data46_47.val=u[46]<<8+u[47]
global.data48_49.val=u[48]<<8+u[49]
global.data50_51.val=u[50]<<8+u[51]
global.data52_53.val=u[52]<<8+u[53]
global.data54_55.val=u[54]<<8+u[55]
global.data56_57.val=u[56]<<8+u[57]
global.data58_59.val=u[58]<<8+u[59]
global.data60_61.val=u[60]<<8+u[61]
global.data62_63.val=u[62]<<8+u[63]
global.data64_65.val=u[64]<<8+u[65]
global.data66_67.val=u[66]<<8+u[67]
global.data68_69.val=u[68]<<8+u[69]
global.data72_73.val=u[72]<<8+u[73]
global.data74.val=u[74]
global.data75_78.val=u[75]<<8+u[76]<<8+u[77]<<8+u[78]
global.data79_82.val=u[79]<<8+u[80]<<8+u[81]<<8+u[82]
global.data83_86.val=u[83]<<8+u[84]<<8+u[85]<<8+u[86]
global.data87_90.val=u[87]<<8+u[88]<<8+u[89]<<8+u[90]
global.data91_92.val=u[91]<<8+u[92]
global.data93_94.val=u[93]<<8+u[94]
global.data95_96.val=u[95]<<8+u[96]
global.data97_98.val=u[97]<<8+u[98]
global.data99_100.val=u[99]<<8+u[100]
global.data101_102.val=u[101]<<8+u[102]
global.data103.val=u[103]
global.data104.val=u[104]
global.data105.val=u[105]
global.data115.val=u[115]
global.data116_117.val=u[116]<<8+u[117]
global.data118.val=u[118]
global.data119_120.val=u[119]<<8+u[120]
global.data121_122.val=u[121]<<8+u[122]
global.data123.val=u[123]
global.data136_137.val=u[136]<<8+u[137]
udelete frameLength //删除已经解析过的数据
getFrameFlag=0 //清空标记变量
}
定长hex-某bms串口协议-样例工程下载
演示工程下载链接: