crc 校验错误_电气工程师图文讲述RS485中的crc校验,其实也没那么难

我们现在已经搞清楚了crc校验的算法,本文我就向大家具体讲解一下如何把crc校验加入到我们的程序里。

1 、crc校验使用原理

crc校验在程序中运行的原理主要可以分为以下几步。

第一步:主站发送数据前把要发送的数据进行crc校验,将要发送的数据和crc校验的结果一起发送给从站。

第二步:从站接收到主站发送的数据后对除去crc校验码以外的数据再次进行crc校验计算。

第三步:从站把自己算出来的校验码和从主站接收到的校验码进行比对,如果一样则说明接收到的是正确的数据,进行下一步程序。如果不一样则说明接收到的是错误的数据,重新进入等待接收状态。

第四步:如果接收到的是正确的数据,从站将要返回给主站的数据进行crc校验,并将返回数据与校验结果一并发回给主站。

2、程序的编写

此处我就用之前的向V区写入数值的程序来向大家演示如何将上面说的流程融入到整个程序中。这里我们程序的变化都在接收完成中断和子程序Write中大家可以着重看这两部分程序。

图2-1主程序

2942a0ded42b4351a58f1aa130ce2a18.png

图2-1

图 2-2~图 2-4是接收完成中断

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 RS485 通讯,如果接收到的数据在进行 CRC 校验之后发现错误,那么可以根据协议要求重新发送数据。 具体的实现步骤如下: 1. 在发送数据时,在数据末尾添加一个 CRC 校验码,以保证数据的完整性和正确性。 2. 接收到数据后,对数据进行 CRC 校验。如果校验失败,可以向发送发送一个 NAK(Negative Acknowledgement)表示数据错误。 3. 发送方收到 NAK 后,重新发送数据。可以在每次发送数据前设置一个超时时间,如果超过一定时间还有收到确认应答,则认为数据发送失败,可以进行重试或者放弃发送。 以下是一个示例代码: ``` // 发送数据 void send_data(int fd, char* data, int length) { // 计算 CRC 校验码 uint16_t crc = calculate_crc(data, length); data[length] = crc & 0xff; data[length + 1] = crc >> 8; // 发送数据 write(fd, data, length + 2); } // 接收数据 int receive_data(int fd, char* buffer, int length) { int n = read(fd, buffer, length); // 校验 CRC uint16_t crc = calculate_crc(buffer, n - 2); uint16_t received_crc = buffer[n - 1] << 8 | buffer[n - 2]; if (crc != received_crc) { // CRC 校验失败,发送 NAK char nak[] = {0xff}; write(fd, nak, sizeof(nak)); return -1; } // CRC 校验成功,发送 ACK char ack[] = {0x00}; write(fd, ack, sizeof(ack)); return n; } // 计算 CRC 校验码 uint16_t calculate_crc(char* data, int length) { uint16_t crc = 0xFFFF; for (int i = 0; i < length; i++) { crc ^= data[i]; for (int j = 0; j < 8; j++) { if (crc & 0x0001) { crc = (crc >> 1) ^ 0xA001; } else { crc = crc >> 1; } } } return crc; } ``` 在实际应用,还需要考虑一些特殊情况,例如数据丢失、数据重复等问题,需要根据具体的协议和硬件要求进行处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值