crc 校验错误_RS485中的crc效验,你知道多少?「系列15」

写了这么多了终于写到了校验可能大部分人都觉得校验是整个通讯过程中最复杂的一个环节。下面我就系统的给大家来介绍一下校验的整个过程。

1 .什么是校验

要搞懂校验的整个过程我们先来看看到底什么是校验,可能在我之前的文章中大家也发现了我所写过的程序没有一个和校验有关系,站点与站点之间数据的传递都是直接进行收发,而且也没有出现过任何问题,既然不写校验程序也能正常运行,那校验在我们的整个通讯过程中到底起着什么样的作用呢?

其实这里可能大家忽略了一个问题,我之前文章中所写的程序都是在实验环境中运行的,电脑与PLC之间的距离不超过2米,周围也没有会产生电磁干扰的用电设备,在这样理想的环境中,数据在传输过程中肯定不会发生任何变化,所以写不写校验程序都无所谓,但是在我们的工业现场环境就非常复杂甚至恶劣了,数据在传输过程中很可能由于外部复杂的环境发生变化,甚至是丢失,那么接收到的数据就不是对方发出的数据了,报文的内容就发生了变化,如果变化后的报文没有任何指令含义还好说,一旦变化后的报文的含义发生转变,比如本来主站发出的报文是控制A设备的,但是由于现场的干扰报文变成了控制B设备,那么就会在控制过程中出现误操作,这种情况虽然概率极低但是非常危险。因此我们需要对所有传输的数据进行校验以判断接收到的数据是否和对方发送的数据是一致的。

2. crc校验

下面我就向大家介绍一种工业控制中非常常用的一种校验算法crc校验,首先我用文字向大家描述一下crc校验算法的整个流程。

1) 向一个16位寄存器A装载16个1也就是16#FFFF

2) 取被校验串的第一个字节与16位寄存器A的高位字节进行“异或”运算,运算结果存回寄存器A。

3) 把寄存器A内

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。
在 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、付费专栏及课程。

余额充值