例1000:某bms串口协议-主动解析样例工程

某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

校验和低字节

备注1-充电管状态,

数值

说明

0

关闭

1

打开

2

单体过压

3

过流

4

5

总压过压

6

电池过温

7

功率过温

8

电流异常

9

均衡线掉串

10

主板过温

11

12

开启失败

13

充电管异常

14

等待

15

手动关闭

16

二级过压

17

低温保护

18

压差保护

19

20

21

22

总压单体异常

备注2-放电管状态

数值

说明

0

关闭

1

打开

2

单体欠压

3

过流

4

二级过流

5

总压欠压

6

电池过温

7

功率过温

8

电流异常

9

均衡线掉串

10

主板过温

11

12

短路保护

13

放电管异常

14

开启失败

15

手动关闭

16

耳机欠压

17

低温保护

18

压差保护

19

20

21

22

总压单体异常

备注3

数值

说明

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

备注6

数值

说明

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串口协议-样例工程下载

演示工程下载链接:

《定长hex-某bms串口协议》演示工程下载