|
本帖最后由 mangolu 于 2021-1-18 01:13 编辑
请教坛里很多MODBUS计算CRC16的方法两个uint8_t return (CRCcode_L << 8 | CRCcode_H)能得到uint16_t?
代码如下:
- /**************************************************************************************************
- NAME : comp_crc16
- INPUT : unsigned char *pack 数据缓冲首地址, unsigned char num 数据字节数
- OUTPUT : unsigned int 计算结果,低位在前 高位在后(MODBUS 规定)。
- FUNCTION :
- CRC16 计算 MODBUS使用公式:X16+X15+X2+1 。此不同于CITT公式
- **************************************************************************************************/
- unsigned int comp_crc16(unsigned char *pack, unsigned char num)
- {
- unsigned char CRCcode_H = 0XFF; // 高CRC字节初始化
- unsigned char CRCcode_L = 0XFF; // 低CRC 字节初始化
- unsigned char index; // 数据索引
- while (num--)
- {
- index = CRCcode_L ^ (*pack++);
- CRCcode_L = CRCcode_H ^ CRC_H[index];
- CRCcode_H = CRC_L[index];
- }
- return (CRCcode_L << 8 | CRCcode_H); // MODBUS 规定低位在前
- }
复制代码
按照我的理解,CRCcode_L为uint8_t,左移8位后应应该为0x00吧?两个uint8_t相或后,能返回uint16_t值?我看了坛里很多代码都是这样的。
而freemodbus里的代码为:
- USHORT
- usMBCRC16( UCHAR * pucFrame, USHORT usLen )
- {
- UCHAR ucCRCHi = 0xFF;
- UCHAR ucCRCLo = 0xFF;
- int iIndex;
- while( usLen-- )
- {
- iIndex = ucCRCLo ^ *( pucFrame++ );
- ucCRCLo = ( UCHAR )( ucCRCHi ^ aucCRCHi[iIndex] );
- ucCRCHi = aucCRCLo[iIndex];
- }
- return ( USHORT )( ucCRCHi << 8 | ucCRCLo );
- }
复制代码
明显这里的代码采用了强制类型转换,这样的结果才是正确的。
我就很疑惑,坛里很多人的代码真能正常计算吗? |
阿莫论坛20周年了!感谢大家的支持与爱护!!
月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!
|