- 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)