关于51单片机上实现modbus协议.docVIP

  • 194
  • 0
  • 约6.58千字
  • 约 8页
  • 2021-10-18 发布于山东
  • 举报
(完好word版)对于51单片机上实现modbus协议 (完好word版)对于51单片机上实现modbus协议 PAGE / NUMPAGES (完好word版)对于51单片机上实现modbus协议 对于 51 单片机上实现 modbus 协议 你找一个 MODBUS 的协议详尽资料好漂亮看, 就是一种通信商定, 你依据它规定的格式通信就能够了 协议发送给咨询方。 Modbus 协议包含 ASCII 、 RTU 、TCP 等,并无规定物理层。 议定义了控制器能够认识和使用的信息构造, 而不论它们是经过何种网络进行通信的。  此协 标准 的 Modicon 控制器使用 RS232C 实现串行的 Modbus 。 Modbus 的 ASCII 、RTU 协议规定了信息、数据的构造、命令和就答的方式, 数据通信采纳 Maser/Slave 方式, Master 端发出数据恳求信息, Slave 端接收到正确信息后就能够发送数 据到 Master 端以响应恳求; Master 端也能够直接发信息改正 Slave 端的数据, 实现双向读写。 Modbus 协议需要对数据进行校验, 串行协议中除有奇偶校验外, ASCII 模式采纳 LRC 校验, RTU 模式采纳 16 位 CRC 校验,但 TCP 模式没有额外规定校验,因为 TCP 协议是一个面向连结的靠谱协议。此外, Modbus 采纳主从方式准时收发数据,在实质使用中假如 某 Slave 站点断开后(如故障或关机), Master 端能够诊疗出来,而当故障修复后,网络又可自动接通。所以, Modbus 协议的靠谱性较好。 下边我来简单的给大家介绍一下,对于 Modbus 的 ASCII 、RTU 和 TCP 协议来说,此中 TCP 和 RTU 协议特别近似,我们只需 把 RTU 协议的两个字节的校验码去掉,而后在 RTU 协议的开始加上 5个0和一个 6并通 过 TCP/IP 网络协议发送出去即可。所以在这里我仅介绍一下 Modbus 的 ASCII 和 RTU 协 议。 下表是 ASCII 协讲和 RTU 协议进行的比较: 协议 开始标志 结束标志 校验 传输效 率 程序办理 ASCII : (冒号) CR,LF LRC 低 直观,简单,易调试 RTU 无 无 CRC 高 不直观,稍复杂 经过比较能够看到, ASCII 协讲和 RTU 协议对比拥有开始和结束标志,所以在进行程序办理时能更为方便,并且因为传输的都是可见的 ASCII 字符,所以进行调试时就更为的直观,此外它的 LRC 校验也比较简单。 但是因为它传输的都是可见的 ASCII 字符, RTU 传输的数据每一个字节 ASCII 都要用两个字节来传输,比方 RTU 传输一个十六进制数 0xF9,ASCII 就需要传输 ’F’’的 9ASCII’ 码 0x39 和 0x46 两个字节,这样它的传输的效率就比较低。所以一般来说,假如所需要传输的数据量较小能够考虑使用 ASCII 协议,假如所需传输的数据量比较大,最好能使用 RTU 协议。 下边对两种协议的校验进行一下介绍。 1、 LRC 校验 LRC 域是一个包含一个 8 位二进制值的字节。 LRC 值由传输设施来计算并放到信息帧中, 接收设施在接收信息的过程上当算 LRC ,并将它和接收到信息中 LRC 域中的值比较,假如 两值不等,说明有错误。 LRC 校验比较简单,它在 ASCII 协议中使用,检测了信息域中除开始的冒号及结束的回车 换行号外的内容。它不过是把每一个需要传输的数据按字节叠加后取反加 1 即可。下边是 它的 VC 代码: BYTE GetCheckCode(const char * pSendBuf, int nEnd)// 获取校验码 { BYTE byLrc = 0; char pBuf[4]; int nData = 0; for(i=1; iend; i+=2) //i 初始为 1,避开 “开始标志 ”冒号 { //每两个需要发送的 ASCII 码转变为一个十六进制数 pBuf [0] = pSendBuf [i]; pBuf [1] = pSendBuf [i+1]; pBuf [2] = \0; sscanf(pBuf,%x, nData); byLrc += nData; } byLrc = ~ byLrc; byLrc ++; return byLrc; } 2、 CRC 校验 CRC 域是两个字节, 包含一 16 位的二进制值。 它由传输设施计算后加入到信息中。 接收设 备从头计算收到信息的 CRC ,并与接收到的 CRC 域中的值比较,假如两值不一样,则有误。 CRC 是先调入一值是全 “ 1的

文档评论(0)

1亿VIP精品文档

相关文档