例1000:某bms串口协议1
| 字节 | 说明 | 备注 | 
|---|---|---|
| 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串口协议1-样例工程下载
演示工程下载链接: