1. 通讯协议
本驱动器使用 MODBUS-RTU(国标 GB/T19582-2008)通讯协议进行通讯, 支持一台主站控制多个从站(即驱动器),支持最多 255 个从站,支持通讯广播(从站地址为 0 视为广播帧),主站可以是单片机、PLC 或 PC 机等。
1.1 通讯参数
默认通讯参数:
- > 波特率固定为 9600bps。
- > 数据位为 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 实时状态寄存器
表 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);
}