
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 实时状态레지스터
| 레지스터주소 | 설명 | 取值范围 | 支持기능 코드 | 备注 |
| 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.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 的2진수데이터프레임缓冲区的指针。
unsigned short us데이터Len;프레임缓冲区的바이트数。
注:以下 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, us데이터Len) /* 函数以 unsigned short 유형返回 CRC */
unsigned char *puchMsg, /* 用于계산 CRC 的프레임*/
| unsigned short us데이터Len | /* 프레임中的바이트数*/ |
| { | |
| unsigned charuchCRCHi = 0xFF; | /* CRC 的高바이트初始化*/ |
unsigned charuchCRCLo = 0xFF; /* CRC 的低바이트初始化*/
unsigned uIndex ; /* CRC 查询表索引*/
while (us데이터Len--)
{
/* 完成整个프레임缓冲区*/
uIndex = uchCRCLo ^ *puchMsg++; /* 계산 CRC */
uchCRCLo = uchCRCHi ^ auchCRCHi[uIndex];
uchCRCHi = auchCRCLo[uIndex];
}
return (uchCRCHi << 8 | uchCRCLo);
}
답글 작성