嵌入式技术论坛
直播中

jsqueh

8年用户 1226经验值
私信 关注
[问答]

agile_modbus遇到一个rtu主机要求crc16值要swap时如何处理呢

agile_modbus是支持多主机的,但遇到一个rtu主机要求crc16值要swap时如何处理?遇到modbus的主机要求CRC16值要SWAP时该如何处理呢?

回帖(4)

qjqb

2022-8-2 10:41:30
自己看源码吧 CRC校验高低位需要调整的话,自己动手

/** @defgroup RTU_Private_Functions RTU Private Functions
* @{
*/
/**
* @Brief   RTU CRC16 计算
* @param   buffer 数据指针
* @param   buffer_length 数据长度
* @Return  CRC16 值
*/
static uint16_t agile_modbus_rtu_crc16(uint8_t *buffer, uint16_t buffer_length)
{
    uint8_t crc_hi = 0xFF; /* high CRC byte initialized */
    uint8_t crc_lo = 0xFF; /* low CRC byte initialized */
    unsigned int i;        /* will index into CRC lookup */
    /* pass through message buffer */
    while (buffer_length--) {
        i = crc_hi ^ *buffer++; /* calculate the CRC  */
        crc_hi = crc_lo ^ _table_crc_hi;
        crc_lo = _table_crc_lo;
    }
    return (crc_hi << 8 | crc_lo);
}
举报

万航渡路

2022-8-2 10:41:37
自己写个调整字节顺序的宏定义
举报

万航渡路

2022-8-2 10:41:49
libmodbus 里有这种函数

static inline uint16_t bswap_16(uint16_t x)
{
    return (x >> 8) | (x << 8);
}
static inline uint32_t bswap_32(uint32_t x)
{
    return (bswap_16(x & 0xffff) << 16) | (bswap_16(x >> 16));
}
举报

丁冬芹

2022-8-2 10:41:59
自己写个调整函数,解决
举报

更多回帖

×
20
完善资料,
赚取积分