
1. Communication protocol
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 0x06 0x10
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, 0 xC0, 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,
- 0x51, 0x93, 0x53, 0x52, 0x92, 0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,
- > 数据位为 8 位。
- > 校验为“无+1 停止位”。
- > 从站地址固定为 1。 用户自定义通讯参数:
- > 波特率可配置范围 9600-115200bps。
- > 数据位固定为 8 位。
- > 校验方式可配置为: “偶+1 停止位”、“奇+1 停止位”和“无+2 停止位”。
- > 从站地址可设置范围 1~255。
当数据帧通信中断超过 4 个字节的打包时间判定为帧接收超时。当发生帧超时的时候,之前接收到的数据将被 视为无效。
1.2 MODBUS-RTU 帧格式
本驱动器支持 MODBUS 的 0x03(读保持寄存器)、0x06(写单个寄存器)和 0x10(写多个寄存器)功能码。
1.2.1 0x03 读保持寄存器
主站发送:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x03 | 起始寄存器 高字节 | 起始寄存器 低字节 | 寄存器数高字节 | 寄存器数 低字节 | CRC 低字节 | CRC 高字节 |
第 1 字节 ADR: 从站地址码(=001~254)。
第 2 字节 0x03: 读寄存器值功能码。
第 3、4 字节: 要读的寄存器开始地址。
第 5、6 字节: 要读的寄存器数量。
第 7、8 字节: 从字节 1 到 6 的 CRC16 校验码 。
从站回送:
| 字节 | 1 | 2 | 3 | 4 、5 | 6 、7 | … | M-1、M | M+1 | M+2 |
| 内容 | ADR | 0x03 | 字节总数 | 寄存器 数据 1 | 寄存器 数据 2 | … | 寄存器数据 M | CRC 低字节 | CRC 高 字节 |
第 1 字节 ADR: 从站地址码(=001~254)。
第 2 字节 0x03: 返回读功能码。
第 3 字节:从 4 到 M(包括 4 及 M)的字节总数。
第 4 到 M 字节: 寄存器数据。
第 M+1、M+2 字节: 从字节 1 到 M 的 CRC16 校验码。
当从站接收错误时, 从站回送:
| 字节 | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x83 | 异常码 | CRC 低字节 | CRC 高字节 |
第 1 字节 第 2 字节 第 3 字节
ADR: 从站地址码(=001~254)。
0x83: 读寄存器值出错。
第 4、5 字节: 从字节 1 到 3 的 CRC16 校验码。
1.2.2 0x06 写单个寄存器
主站发送:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x06 | 寄存器高 字节地址 | 寄存器低 字节地址 | 数据高字节 | 数据低字节 | CRC 码低字节 | CRC 码高字节 |
当从站接收正确时, 从站回送:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x06 | 寄存器高 字节地址 | 寄存器低 字节地址 | 数据高字节 | 数据低字节 | CRC 码低字节 | CRC 码高字节 |
当从站接收错误时, 从站回送:
| 字节 | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x86 | 异常码 | CRC 低字节 | CRC 高字节 |
第 1 字节 第 2 字节 第 3 字节
ADR: 从站地址码(=001~254)。
0x86: 写寄存器值出错功能码。
第 4、5 字节: 从字节 1 到 3 的 CRC16 校验码。
1.2.3 0x10 写多个寄存器值
主站发送:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| 内容 | ADR | 0x10 | 起始寄存器 高字节地址 | 起始寄存器 低字节地址 | 寄存器数 量高字节 | 寄存器数 量低字节 | 数据字 节总数 |
| 字节 | 8,9 | 10,11 | N,N+1 | N+2 | N+3 |
| 内容 | 寄存器数据 1 | 寄存器数据 2 | 寄存器数据 M | CRC 码低字节 | CRC 码高字节 |
当从站接收正确时, 从站回送:
| 字节 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 内容 | ADR | 0x10 | 寄存器高 字节地址 | 寄存器低 字节地址 | 寄存器数 量高字节 | 寄存器数 量低字节 | CRC 码低字节 | CRC 码高字节 |
当从站接收错误时,从站回送:
| 字节 | 1 | 2 | 3 | 4 | 5 |
| 内容 | ADR | 0x90 | 异常码 | CRC 低字节 | CRC 高字节 |
第 1 字节 第 2 字节 第 3 字节
ADR: 0x90: 异常码:
从站地址码(=001~254)。
写寄存器值出错。
第 4、5 字节: 从字节 1 到 3 的 CRC16 校验码。
1.2.4 错误异常码
MODBUS 异常码 :如表 1.1 所示
表 1. 1 MODBUS 异常码表
| 异常码 | 含义 |
| 0x01 | 非法功能码 |
| 0x02 | 非法数据地址 |
| 0x03 | 非法数据值 |
| 0x04 | 从站设备故障 |
| 0x05 | 请求已被确认,但需要较长时间来处理请求 |
| 0x06 | 从设备忙 |
| 0x08 | 存储奇偶性差错 |
| 0x0A | 不可用的网关 |
| 0x0B | 网关目标设备响应失败 |
2. 标准寄存器定义
2.1 设备描述信息寄存器
表 2. 1 设备描述信息寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0000 (0) | 设备标识号 | 0x03 | 每个型号都有对应的设备标识号 | |
| 0x0001 (1) | 设备版本 | 0x03 | 高字节为主版本号,低字节为副版本号 | |
| 0x0002 (2) | 最大电流 | 0x03 | 数值乘以0.01为电流值,单位为A |
| 0x0003~0x0007(3)~(7) | 保留 | 0x03 |
表 2.2 实时状态寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0008 (8) | 实时电流 | 0~65535 | 0x03 | 数值乘以 0.01 为电流值,单位为 A |
| 0x0009 (9) | 实时速度之高半字 | -110000~110000 | 0x03 | 实时转速,单位为 RPM |
| 0x000A (10) | 实时速度之低半字 | |||
| 0x000B (11) | 错误状态 | 0~13 | 0x03 | 0 无错误1:堵转停机2:相序未学习3:相位异常4:相线过流5:母线过流6:电压过高7:电压过低,8:相位学习异常9:过载异常10:485 通信中断11:CAN 通讯中断12:母线电压过高13:温度过高,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 | 数值乘以 0.1%为 PWM 百分比,单位为‰ |
| 0x0015(21) | 输入 PWM 占空比 | 0~1000 | 0x03 | 数值乘以 0.1%为输入 PWM 占空比,单位为‰ |
| 0x0016(22) | 电压 | 0~100 | 0x03 | 电源电压,单位为 V |
| 0x0017(23) | 温度 | -200~200 | 0x03 | 电路板温度,单位为℃ |
| 0x0018(24) | 保留 |
2.3 电机控制寄存器
电机控制寄存器如表 2.3 所示。
表 2.3 电机控制寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0020 (32) | 停止 | 0, 1, 2 | 0x03 0x06 | 0:正常停止1:紧急制动2:自由停止 |
| 0x0021 (33) | 设定目标参数之高半字 | 闭环:-最高转速~ 最高转速开环:-1000~1000 | 0x03 0x06 0x10 | 当速度控制为闭环,代表速度,则单位为 RPM;当速度控制为开环,代表 PWM,数值乘以 0.1%为 PWM 百分比。正数表示正转,负数表示反转, 0 正常停止 |
| 0x0022 (34) | 设定目标参数之低半字 | |||
| 0x0023 (35) | 测试控制 | 0, 1 | 0x03 0x06 | 0:取消测试,1:相序学习 |
| 0x0024 (36) | 输出控制 | 0, 1 | 0x03 0x06 | 0:输出低电平1:输出高电平 |
| 0x0025~0x27(37)~ (39) | 保留 |
2.4 电机参数配置寄存器
表 2.4 电机参数配置寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0028 (40) | 电机额定电流 | 0~1500 | 0x03 0x06 0x10 | 数值乘以 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 相相序数据 | 高字节为 0~6低字节为 0~6 | 0x03 0x06 0x10 | 低字节为 1 相高字节为 2 相 |
| 0x002F (47) | 电机 3 、4 相相序数据 | 高字节为 0~6低字节为 0~6 | 0x03 0x06 0x10 | 低字节为 3 相高字节为 4 相 |
| 0x0030 (48) | 电机 4 、6 相相序数据 | 高字节为 0~6低字节为 0~6 | 0x03 0x06 0x10 | 低字节为 4 相高字节为 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:不停机锁相其他数值:数值乘以 0.01 为电流值,单位为 A |
| 0x003A~0x 3F(58)~ (63) | 保留 |
2.5 系统参数配置寄存器
系统参数配置寄存器如表 2.5 所示。
表 2.5 系统参数配置寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0040 (64) | 堵转停机时间 | 0~66635 | 0x03 0x06 0x10 | 单位为 mS |
| 0x0041 (65) | 保护关断电流 | 0~4200 | 0x03 0x06 0x10 | 数值乘以 0.01 为电流值, 单位为 A |
| 0x0042 (66) | 内部电位器控制阈值最大值 | 0~3300 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0043 (67) | 内部电位器控制阈值最小值 | 0~3300 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0044 (68) | 外部输入控制阈值最大值 | 0~10000 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0045(69) | 外部输入控制阈值最小值 | 0~10000 | 0x03 0x06 0x10 | 单位为 mV |
| 0x0046 (70) | 保护电压阈值最大值(过压保护 电压) | 8~56 | 0x03 0x06 0x10 | 保护电压范围,单位为 V |
| 0x0047 (71) | 保护电压阈值最小值(欠压保护 电压) | 8~56 | 0x03 0x06 0x10 | |
| 0x0048 (72) | 电压保护设置 | 0,1 | 0x03 0x06 0x10 | 0:不保护1:电压保护 |
| 0x0049(73) | 输出类型 | 0,1,2,3,4,5 | 0x03 0x06 0x10 | 0:不输出(即输出低电 平)1:长输出2:报警信号输出3:FG 反馈信号输出4:停机信号输出5:通讯控制 |
2.6 PID 参数配置寄存器
闭环控制 PID参数配置寄存器如表 2.6 所示。
表 2.6 闭环控制 PID 参数配置寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x004A (74) | 速度闭环 P 系数高半字 | 建议 1~327680 | 0x03 0x10 | 数值除以 32768 为实际值 |
| 0x004B (75) | 速度闭环 P 系数低半字 | |||
| 0x004C (76) | 速度闭环 I 系数高半字 | 建议 1~326780 | 0x03 0x10 | 数值除以 32768 为实际值 |
| 0x004D (77) | 速度闭环 I 系数低半字 | |||
| 0x004E (78) | 速度闭环 D 系数高半字 | 建议 1~326780 | 0x03 0x10 | 数值除以 32768 为实际值 |
| 0x004F (79) | 速度闭环 D 系数低半字 |
通讯参数配置寄存器如表 2.6 所示。
表 2.7 通讯参数配置寄存器
| 寄存器地址 | 描述 | 取值范围 | 支持功能码 | 备注 |
| 0x0050 (80) | 485通讯中断制动时间 | 0~66635 | 0x03 0x060x10 | 单位为 S |
| 0x0051 (81) | 485通讯设备地址 | 0~255 | 0x03 0x060x10 | Modbus 从设备地址 |
| 0x0052 (82) | 485通讯串口波特率 | 0~4 | 0x03 0x060x10 | 0:96001:192002:384003:576004: 115200单位为 bps |
| 0x0053 (83) | 485 通讯串口检验方式 | 0~3 | 0x03 0x060x10 | 0:无+停止位1:偶+1 停止位2:奇+1 停止位3:无+2 停止位 |
| 0x0054(84)~0 x0059 (89) | 保留 |
3.CRC16 的计算
C 语言 CRC 生成函数如程序 3.1所示。所有的可能的 CRC 值都被预装在两个数组中, 当计算报文内容时可 以简单的索引即可。 一个数组含有 16 位 CRC 域的所有 256 个可能的高位字节,另一个数组含有低位字节的值。 这种索引访问 CRC 的方式提供了比对报文缓冲区的每个新字符都计算新的 CRC 更快的方法。
注意: 此函数内部执行高/低 CRC 字节的交换。此函数返回的是已经经过交换的 CRC 值。也就是说,从该 函数返回的 CRC 值可以直接放置于报文用于发送。
函数使用两个参数:
unsigned char *puchMsg;指向含有用于生成 CRC 的二进制数据报文缓冲区的指针。
unsigned short usDataLen;报文缓冲区的字节数。
注:以下 CRC16 生成函数程序摘自 <MODBUS over Serial Line Specification and Implementation Guide
V1.02> 。
/* 高位字节的 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
} ;
/* 低位字节的 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 类型返回 CRC */
unsigned char *puchMsg, /* 用于计算 CRC 的报文*/
| unsigned short usDataLen | /* 报文中的字节数*/ |
| { | |
| unsigned charuchCRCHi = 0xFF; | /* CRC 的高字节初始化*/ |
unsigned charuchCRCLo = 0xFF; /* CRC 的低字节初始化*/
unsigned uIndex ; /* CRC 查询表索引*/
while (usDataLen--)
{
/* 完成整个报文缓冲区*/
uIndex = uchCRCLo ^ *puchMsg++; /* 计算 CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
uchCRCHi = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
Leave a Reply