- 1. 1. 通讯协议
- 2. 1.1 通讯参数
- 3. 1.2 MODBUS-RTU 帧format
- 4. 2. 标准register定义
- 5. 2.1 设备描述信息register
- 6. 2.3 电机控制register
- 7. 2.4 电机参数配置register
- 8. 2.5 system参数配置register
- 9. 2.6 PID 参数配置register
- 10. 3.CRC16 的计算

1. 通讯协议
本驱动器使用 MODBUS-RTU(国标 GB/T19582-2008)通讯协议进行通讯, 支持一台主站控制多个从站(即驱动器),支持最多 255 个从站,支持通讯广播(slave address为 0 视为广播帧),主站可以是单片机、PLC 或 PC 机等。
1.1 通讯参数
默认通讯参数:
- > Baud rate固定为 9600bps。
- > data bit为 8 位。
- > 校验为“无+1 stop bit”。
- > slave address固定为 1。 用户Customization通讯参数:
- > Baud rate可配置范围 9600-115200bps。
- > data bit固定为 8 位。
- > 校验方式可配置为: “偶+1 stop bit”、“奇+1 stop bit”和“无+2 stop bit”。
- > slave address可设置范围 1~255。
当data帧通信中断超过 4 个byte的打包time判定为帧receive超时。当发生帧超时的时候,之前receive到的data将被 视为Invalid。
1.2 MODBUS-RTU 帧format
本驱动器支持 MODBUS 的 0x03(读保持register)、0x06(写单个register)和 0x10(写多个register)function code。
1.2.1 0x03 读保持register
主站send:
| byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x03 | startregister 高byte | startregister 低byte | register数高byte | register数 低byte | CRC lowbyte | CRC 高byte |
第 1 byte ADR: slave address码(=001~254)。
第 2 bytes 0x03: 读register valuefunction code。
第 3、4 bytes: 要读的register开始address。
第 5、6 byte: 要读的number of registers。
第 7、8 bytes: 从byte 1 到 6 的 CRC16 校验码 。
从站回送:
| byte | 1 | 2 | 3 | 4 、5 | 6 、7 | … | M-1、M | M+1 | M+2 |
| 内容 | ADR | 0x03 | byte总数 | register data 1 | register data 2 | … | register data M | CRC lowbyte | CRC high byte |
第 1 byte ADR: slave address码(=001~254)。
第 2 bytes 0x03: 返回读function code。
第 3 byte:从 4 到 M(包括 4 及 M)的byte总数。
第 4 到 M byte: register data。
第 M+1、M+2 bytes: 从byte 1 到 M 的 CRC16 校验码。
当从站receiveError时, 从站回送:
| byte | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x83 | Exception Code | CRC lowbyte | CRC highbyte |
第 1 byte 第 2 bytes 第 3 byte
ADR: slave address码(=001~254)。
0x83: 读register value出错。
第 4、5 byte: 从byte 1 到 3 的 CRC16 校验码。
1.2.2 0x06 写单个register
主站send:
| byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x06 | register高 byteaddress | register低 byteaddress | data高byte | data低byte | CRC 码低byte | CRC 码高byte |
当从站receive正确时, 从站回送:
| byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x06 | register高 byteaddress | register低 byteaddress | data高byte | data低byte | CRC 码低byte | CRC 码高byte |
当从站receiveError时, 从站回送:
| byte | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x86 | Exception Code | CRC lowbyte | CRC highbyte |
第 1 byte 第 2 bytes 第 3 byte
ADR: slave address码(=001~254)。
0x86: 写register value出错function code。
第 4、5 byte: 从byte 1 到 3 的 CRC16 校验码。
1.2.3 0x10 写Multiple register values
主站send:
| byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 内容 | ADR | 0x10 | startregister 高byteaddress | startregister 低byteaddress | register数 量高byte | register数 量低byte | data字 节总数 |
| byte | 8,9 | 10,11 | N,N+1 | N+2 | N+3 |
| 内容 | register data 1 | register data 2 | register data M | CRC 码低byte | CRC 码高byte |
当从站receive正确时, 从站回送:
| byte | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x10 | register高 byteaddress | register低 byteaddress | register数 量高byte | register数 量低byte | CRC 码低byte | CRC 码高byte |
当从站receiveError时,从站回送:
| byte | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x90 | Exception Code | CRC lowbyte | CRC highbyte |
第 1 byte 第 2 bytes 第 3 byte
ADR: 0x90: Exception Code:
slave address码(=001~254)。
写register value出错。
第 4、5 byte: 从byte 1 到 3 的 CRC16 校验码。
1.2.4 ErrorException Code
MODBUS Exception Code :如表 1.1 所示
表 1. 1 MODBUS Exception Code表
| Exception Code | 含义 |
| 0x01 | Illegal function码 |
| 0x02 | Illegal data address |
| 0x03 | Illegal data value |
| 0x04 | Substation equipment malfunction |
| 0x05 | Request已被Confirm,但需要较长time来处理Request |
| 0x06 | 从设备忙 |
| 0x08 | Storage parity error |
| 0x0A | 不可用的网关 |
| 0x0B | Gateway target device response failed |
2. 标准register定义
2.1 设备描述信息register
表 2. 1 设备描述信息register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0000 (0) | 设备标识号 | 0x03 | 每个型号都有对应equipment标识号 | |
| 0x0001 (1) | 设备版本 | 0x03 | 高byte为主版本号,低byte为副版本号 | |
| 0x0002 (2) | 最大电流 | 0x03 | numerical value乘以0.01为电流值,单位为A |
| 0x0003~0x0007(3)~(7) | 保留 | 0x03 |
表 2.2 实时状态register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0008 (8) | 实时电流 | 0~65535 | 0x03 | numerical value乘以 0.01 为电流值,单位为 A |
| 0x0009 (9) | 实时速度之高半字 | -110000~110000 | 0x03 | 实时转速,单位为 RPM |
| 0x000A (10) | 实时速度之低半字 | |||
| 0x000B (11) | Error状态 | 0~13 | 0x03 | 0 无Error1:堵转停机2:相序未学习3:相位异常4:相线过流5:母线过流6:电压过高7:电压过低,8:相位学习异常9:过载异常10:485 通信中断11:CAN 通讯中断12:母线电压过高13:temperature过高,14:无感启动失败15:相电流异常 |
| 0x000C (12) | 内部电位器电压 | 0~3300 | 0x03 | 单位为 mV |
| 0x000D (13) | 外部信号电压 | 0~10000 | 0x03 | 单位为 mV |
| 0x000E (14) | 保留 | |||
| 0x000F (15) | 保留 | |||
| 0x0010 (16) | 使能电平 | 0,1 | 0x03 | 0:低电平1:高电平 |
| 0x0011 (17) | 刹车电平 | 0,1 | 0x03 | 0:低电平1:高电平 |
| 0x0012 (18) | 方向电平 | 0,1 | 0x03 | 0:低电平1:高电平 |
| 0x0013 (19) | 控制模式 | 0x07,0x09,0x19,0x01,0x11,0x0a,0x1a,0x02,0x12,0x0b,0x1b,0x03,0x13,0x0c,0x1c,0x04,0x14,0x0d,0x1d,0x05,0x15,0x08,0x18,0x00,0x10, | 0x03 | 0-4 位中从低到高定义:①第 4 位表示无感 0 或有感 1,②第 3 位表示开环 0 或闭环 1,③第 0-2 位表示模式:相序学习(111),通讯控制(000),内部电位器(001),模拟量(010),PWM(011),航模 PWM(100),摇杆(101)④取值意义:0x07:相序学习, 0x09:无感/闭环/内部电位器控制,0x19:有感/闭环/内部电位器控制,0x01:无感/开环/内部电位器控制,0x11:有感/开环/内部电位器控制, 0x0a:无感/闭环/模拟量控制,0x1a:有感/闭环/模拟量控制,0x02:无感/开环/模拟量控制,0x12:有感/开环/模拟量控制, 0x0b:无感/闭环/PWM 控制,0x1b:有感/闭环/PWM 控制,0x03:无感/开环/PWM 控制,0x13:有感/开环/PWM 控制, 0x0c:无感/闭环/航模 PWM 控制,0x1c:有感/闭环/航模 PWM 控制,0x04:无感/开环/航模 PWM 控制,0x14:有感/开环/航模 PWM 控制, 0x0d:无感/闭环/摇杆控制,0x1d:有感/闭环/摇杆控制,0x05:无感/开环/摇杆控制,0x15:有感/开环/摇杆控制, 0x08:无感/闭环/通讯控制,0x18:有感/闭环/通讯控制,0x00:无感/开环/通讯控制,0x10:有感/开环/通讯控制, |
| 0x0014(20) | 负载率 | 0~1000 | 0x03 | numerical value乘以 0.1%为 PWM 百分比,单位为‰ |
| 0x0015(21) | 输入 PWM 占空比 | 0~1000 | 0x03 | numerical value乘以 0.1%为输入 PWM 占空比,单位为‰ |
| 0x0016(22) | 电压 | 0~100 | 0x03 | 电源电压,单位为 V |
| 0x0017(23) | temperature | -200~200 | 0x03 | 电路板temperature,单位为℃ |
| 0x0018(24) | 保留 |
2.3 电机控制register
电机控制register如表 2.3 所示。
表 2.3 电机控制register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0020 (32) | 停止 | 0, 1, 2 | 0x03 0x06 | 0:正常停止1:紧急制动2:自由停止 |
| 0x0021 (33) | 设定目标参数之高半字 | 闭环:-最高转速~ 最高转速开环:-1000~1000 | 0x03 0x06 0x10 | 当速度控制为闭环,代表速度,则单位为 RPM;当速度控制为开环,代表 PWM,numerical value乘以 0.1%为 PWM 百分比。正数表示正转,负数表示反转, 0 正常停止 |
| 0x0022 (34) | 设定目标参数之低半字 | |||
| 0x0023 (35) | 测试控制 | 0, 1 | 0x03 0x06 | 0:Cancel测试,1:相序学习 |
| 0x0024 (36) | 输出控制 | 0, 1 | 0x03 0x06 | 0:输出低电平1:输出高电平 |
| 0x0025~0x27(37)~ (39) | 保留 |
2.4 电机参数配置register
表 2.4 电机参数配置register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0028 (40) | 电机额定电流 | 0~1500 | 0x03 0x06 0x10 | numerical value乘以 0.01 为电流值, 单位为 A |
| 0x0029 (41) | 电机最大转速之高半字 | 0~110000 | 0x03 0x06 0x10 | 单位为 RPM |
| 0x002A (42) | 电机最大转速之低半字 | |||
| 0x002B (43) | 电机最小转速之高半字 | 0~110000 | 0x03 0x06 0x10 | 单位为 RPM,一般设置在 200RPM 以下 |
| 0x002C (44) | 电机最小转速之低半字 | |||
| 0x002D (45) | 电机极对数 | 0~65535 | 0x03 0x06 0x10 | 定子南北磁极对数,是磁 极的一半 |
| 0x002E (46) | 电机 1 、2 相相序data | 高byte为 0~6低byte为 0~6 | 0x03 0x06 0x10 | 低byte为 1 相高byte为 2 相 |
| 0x002F (47) | 电机 3 、4 相相序data | 高byte为 0~6低byte为 0~6 | 0x03 0x06 0x10 | 低byte为 3 相高byte为 4 相 |
| 0x0030 (48) | 电机 4 、6 相相序data | 高byte为 0~6低byte为 0~6 | 0x03 0x06 0x10 | 低byte为 4 相高byte为 6 相 |
| 0x0031 (49) | 相序学习状态 | 0,1 | 0x03 0x06 0x10 | 0:未学习1:已经学习 |
| 0x0032 (50) | 无感启动负载大小 | 0~4 | 0x03 0x06 0x10 | 0:轻载1:中载2:重载3:小惯性负载4:大惯性负载 |
| 0x0033 (51) | 闭环速度加速加速度 | 100~最大速度 | 0x03 0x06 0x10 | 单位为 RPM/S |
| 0x0034 (52) | 闭环速度减速加速度 | 100~最大速度 | 0x03 0x06 0x10 | 单位为 RPM/S |
| 0x0035 (53) | 开环速度加速加速度 | 4~500 | 0x03 0x06 0x10 | 单位为%/S |
| 0x0036 (54) | 开环速度减速加速度 | 4~500 | 0x03 0x06 0x10 | 单位为%/S |
| 0x0037 (55) | 停止模式 | 0, 1, 2 | 0x03 0x06 0x10 | 0:正常停止1:紧急制动2:自由停止 |
| 0x0038 (56) | 自动换向模式 | 0, 1, 2 | 0x03 0x06 0x10 | 0:正常换向1:急停换向 |
| 0x0039 (57) | 停机锁相电流 | 0~1500 | 0x03 0x06 0x10 | 0:不停机锁相其他numerical value:numerical value乘以 0.01 为电流值,单位为 A |
| 0x003A~0x 3F(58)~ (63) | 保留 |
2.5 system参数配置register
system参数配置register如表 2.5 所示。
表 2.5 system参数配置register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0040 (64) | 堵转停机time | 0~66635 | 0x03 0x06 0x10 | 单位为 mS |
| 0x0041 (65) | 保护关断电流 | 0~4200 | 0x03 0x06 0x10 | numerical value乘以 0.01 为电流值, 单位为 A |
| 0x0042 (66) | 内部电位器控制阈值maximum | 0~3300 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0043 (67) | 内部电位器控制阈值minimum | 0~3300 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0044 (68) | 外部输入控制阈值maximum | 0~10000 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0045(69) | 外部输入控制阈值minimum | 0~10000 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0046 (70) | 保护电压阈值maximum(过压保护 电压) | 8~56 | 0x03 0x06 0x10 | 保护电压范围,单位为 V |
| 0x0047 (71) | 保护电压阈值minimum(欠压保护 电压) | 8~56 | 0x03 0x06 0x10 | |
| 0x0048 (72) | 电压保护设置 | 0,1 | 0x03 0x06 0x10 | 0:不保护1:电压保护 |
| 0x0049(73) | 输出Type | 0,1,2,3,4,5 | 0x03 0x06 0x10 | 0:不输出(即输出低电 平)1:长输出2:报警信号输出3:FG 反馈信号输出4:停机信号输出5:通讯控制 |
2.6 PID 参数配置register
闭环控制 PID参数配置register如表 2.6 所示。
表 2.6 闭环控制 PID 参数配置register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x004A (74) | 速度闭环 P coefficient高半字 | 建议 1~327680 | 0x03 0x10 | numerical value除以 32768 为实际值 |
| 0x004B (75) | 速度闭环 P coefficient低半字 | |||
| 0x004C (76) | 速度闭环 I coefficient高半字 | 建议 1~326780 | 0x03 0x10 | numerical value除以 32768 为实际值 |
| 0x004D (77) | 速度闭环 I coefficient低半字 | |||
| 0x004E (78) | 速度闭环 D coefficient高半字 | 建议 1~326780 | 0x03 0x10 | numerical value除以 32768 为实际值 |
| 0x004F (79) | 速度闭环 D coefficient低半字 |
表 2.7 通讯参数配置register
| register address | 描述 | 取值范围 | 支持function code | 备注 |
| 0x0050 (80) | 485通讯中断制动time | 0~66635 | 0x03 0x060x10 | 单位为 S |
| 0x0051 (81) | 485通讯Device address | 0~255 | 0x03 0x060x10 | Modbus 从Device address |
| 0x0052 (82) | 485通讯串口Baud rate | 0~4 | 0x03 0x060x10 | 0:96001:192002:384003:576004: 115200单位为 bps |
| 0x0053 (83) | 485 通讯串口检验方式 | 0~3 | 0x03 0x060x10 | 0:无+stop bit1:偶+1 stop bit2:奇+1 stop bit3:无+2 stop bit |
| 0x0054(84)~0 x0059 (89) | 保留 |
3.CRC16 的计算
C 语言 CRC 生成函数如程序 3.1所示。所有的可能的 CRC 值都被预装在两个数组中, 当计算message内容时可 以简单的索引即可。 一个数组含有 16 位 CRC 域的所有 256 个可能的高位byte,另一个数组含有低位byte的值。 这种索引访问 CRC 的方式提供了比对message缓冲区的每个新字符都计算新的 CRC 更快的方法。
注意: 此函数内部执行高/低 CRC byte的交换。此函数返回的是已经经过交换的 CRC 值。也就是说,从该 函数返回的 CRC 值可以直接放置于message用于send。
函数使用两个参数:
unsigned char *puchMsg;指向含有用于生成 CRC 的binarydatamessage缓冲区的指针。
unsigned short usDataLen;message缓冲区的byte count。
注:以下 CRC16 生成函数程序摘自 <MODBUS over Serial Line Specification and Implementation Guide
V1.02> 。
/* 高位byte的 CRC 值*/
static unsigned char auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81,
0x40
} ;
/* 低位byte的 CRC 值*/
static char auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06, 0x07, 0xC7, 0x05, 0xC5, 0xC4,
0x04, 0xCC, 0x0C, 0x0D, 0xCD, 0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09, 0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A, 0x1E, 0xDE, 0xDF, 0x1F, 0xDD,
0x1D, 0x1C, 0xDC, 0x14, 0xD4, 0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3, 0xF2, 0x32, 0x36, 0xF6, 0xF7,
0x37, 0xF5, 0x35, 0x34, 0xF4, 0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A, 0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29, 0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED, 0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60, 0x61, 0xA1, 0x63, 0xA3, 0xA2,
0x62, 0x66, 0xA6, 0xA7, 0x67, 0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F, 0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68, 0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E, 0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71, 0x70, 0xB0, 0x50, 0x90, 0x91,
0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B, 0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B, 0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42, 0x43, 0x83, 0x41, 0x81, 0x80,
0x40
};
unsigned short CRC16(puchmsg, usDataLen) /* 函数以 unsigned short Type返回 CRC */
unsigned char *puchMsg, /* 用于计算 CRC 的message*/
| unsigned short usDataLen | /* message中的byte count*/ |
| { | |
| unsigned charuchCRCHi = 0xFF; | /* CRC 的高byte初始化*/ |
unsigned charuchCRCLo = 0xFF; /* CRC 的低byte初始化*/
unsigned uIndex ; /* CRC 查询表索引*/
while (usDataLen–)
{
/* Complete整个message缓冲区*/
uIndex = uchCRCLo ^ *puchMsg++; /* 计算 CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
uchCRCHi = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
发表回复