Modbus在串行总线通信中的协议有RTU和ASCII两种。RTU是Remote Terminal Unit的缩写,意思是远程终端单元。ASCII是American Standard Code for Information Interchange,意思是美国信息交换标准代码,是将文字编辑符号、大小写字母、数字和一些不可见的控制字符进行编码的一种字符表示形式,除了空字符外,共127个字符编码。
两种协议的不同之处,孔丙火(微信公众号:孔丙火)认为,最简单的讲,就是:RTU是直接发送数据,二进制代码,其表示的物理意义,需要发送端和接收端进行约定;ASCII发送的数据是用于表示字符的二进制代码;举例如下:

图1 
在数据发送格式上,两者也有以下不同之处。
(1)ASCII有开始字符和结束字符,可以作为一帧数据开始和结束的标志,用于接收端判断,一个报文必须以一个‘冒号’ ( : )(ASCII 十六进制3A )起始,以‘回车-换行’ (CR LF) (ASCII 十六进制0D 和0A) 结束,如图2所示。而RTU则没有这样的标志,需要用时间间隔来判断一帧数据的开始和结束,协议中规定的是3.5个字符周期,就是在一帧开始前,必须有大于3.5个字符周期的空闲时间,一帧结束后,也必须有大于3.5个字符周期的空闲时间,否则会出错,如图3所示。

图2

图3
特别说明:大家都知道,串口发送数据是以字节为单位的,两个字节的发送时间间隔在RTU中也是有规定的,必须小于1.5个字符周期,不然也会出错。字符周期是一个时间单位,在孔丙火(微信公众号:孔丙火)看来,很多人在做的时候会弄错这个概念,有的人以为是bit,这是不对的,应该是字节,但不是8个bit的字节,而是RTU发送1个字节的实际bit数,这里面包含一些附加位,如起始位、停止位、校验位等,加起来是11个bit,即1个字符周期是11bit的时间。那么问题来了,细心的朋友就会问孔丙火(微信公众号:孔丙火),如果串口参数是无校验的时候,不就是10个bit了吗?的确是这样,所以RTU协议中有明确规定,偶校验是推荐的,但无校验也是允许的,但也推荐,无校验的时候,停止位最好设置为2位,就是为了确保1个字符周期是11bit。
(2)两者的数据域的长度不同,RTU数据域的长度为252字符,而ASCII的是其两倍,这是由于本文第2段所述的原因,同时为了两种协议的应用层数据保持一致,才做出这样的规定。孔丙火(微信公众号:孔丙火)还注意到一个问题,在标准中,描述数据域长度使用的单位是字符,而不是字节,我想这跟我在上段中描述的11bit的问题有关,用字符更加准确。
(3)两者的数据帧校验方式不同。RTU使用CRC校验,即循环冗余检验,ASCII使用的是LRC,即纵向冗余校验。
(4)在Modbus标准中,RTU是必须要求的,而ASCII是可选项,即作为一个Modbus通信设备可以只支持RTU,也可以同时支持RTU和ASCII,但不能只支持ASCII。
参考文献:GB/T 19582-2008。
文章在微信公众号同步推出,微信公众号:孔丙火,关注欣赏更多文章。

本订阅号致力于单片机、PLC、嵌入式软硬件的设计经验分享,秉承“点点滴滴皆智慧”的理念,一起分享,共同交流。

最新文章

  1. 将SHP导入MySQL中
  2. 3、面向对象以及winform的简单运用(类的初步认识)
  3. vim时,ctrl+s了一下,程序僵死了
  4. qtcreator cannot find -lts
  5. (转)C#创建windows服务
  6. ACM1019_最大公倍数
  7. cocos2d疑问
  8. C#语言的新特性及相关信息
  9. PHPexcel:多sheet上传和下载
  10. 使IIS Express支持其他网络客户端访问
  11. 200行代码实现简版react🔥
  12. js动画(速度)
  13. js常用正则收集
  14. JS 日期实用方法
  15. Classifier
  16. Harbor快速部署到Kubernetes集群及登录问题解决
  17. sql 日志统计-日、周、月活跃数
  18. SVN 提交、更新、解决冲突等操作步骤
  19. UITableView编辑模式
  20. lua-redis-parser module

热门文章

  1. CET-4 Word 计划表
  2. 想在java接口自动化里用上Python的requests?这样做就可以了
  3. uniapp 获取元素高度 距离顶部高度等
  4. Mybatis实例及配置(一)
  5. python实践项目1
  6. [java]将多个文件压缩成一个zip文件
  7. 阿里云前端路线 | CSS快速掌握
  8. vmware启动winodws时报错弹出【无法连接MKS:套接字连接尝试次数太多;正在放弃;】
  9. 整理的网上的MySQL优化文章总结
  10. Linq To EF 用泛型时生成的Sql会查询全表的问题