UART和RS232/RS485的关系,RS232与RS485编程

简介: http://wpp9977777.blog.163.com/blog/static/4625100720138495943540/      串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。

http://wpp9977777.blog.163.com/blog/static/4625100720138495943540/

 

   串口通讯是电子工程师和嵌入式开发工程师面对的最基本问题,RS232则是其中最简单最常用的通讯方式。但是初学者往往搞不清有关的名词如UART和RS232或RS485之间是什么关系,因为它们经常被放到语句中同等的位置使用。在百度搜索二者的区别,可以看到排在最前面的答案充斥着混淆的概念。就此,谈谈我对这几个概念的理解,希望能帮初学者厘清它们之间的关系。

~
~
       通讯问题,和交通是一样的。串口通信,我们这里可以用公交来类比。
        UART和RS232/RS485的关系是什么? - cp4 - Red Stone  Blue Sky         UART和RS232/RS485的关系是什么? - cp4 - Red Stone  Blue Sky
       公交运行可以简单分成两个部分:
       1、车站
       2、公路
       其中车站决定了车上装什么(人),怎么发送(班次)等。
       当汽车跑在路上,就要遵守公路交通的规则,过桥有过桥的规则,高速有高速的规则,和车站没有关系了。
~
       回到串口通讯,其实,UART就相当于车站,而RS232/RS485则对应于公路的规则。
        UART,是通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),既然是“器”,显然,它就是个设备而已,要完成一个特定的功能的硬件,它本身并不是协议。那么它要完成什么功能呢?它的最基本功能,是串行数据和并行数据之间的转换。我们知道,计算机中的数据以Byte为基本单位,对一个Byte的存取是并行的,即,同时取得/写入8个bit。而串行通信,需要把这个Byte“打碎”,按照时间顺序来收发以实现串行。例如:
       内存中的数据是: 1 1 1 0 0 1 0 1
       串行发送的实际效果是(按时间排序【注1】):
       1
       0
       1
       0
       0
       1
       1
       1
      接收则是上述过程的逆过程。
      这就是UART做的最基本工作,进一步的,它还要控制“发车的班次”,比如确认一个Byte的这8个bit是什么时候开始的,又是什么时候结束的,两个班次之间至少要隔多长时间的缓冲,等等。这一部分,也具有协议的特征,但是相对于道路上的协议,更具有一般性,或曰,是与车在什么道路上开,相对独立的。
       那么道路上的规定是什么样的呢?
        RS232/RS485,是两种不同的电气协议,也就是说,是对电气特性以及物理特性的规定,作用于数据的传输通路上,它并不内含对数据的处理方式。比如,最显著的特征是:RS232使用3-15v有效电平,而UART,因为对电气特性并没有规定,所以直接使用CPU使用的电平,就是所谓的TTL电平(可能在0~3.3V之间)。更具体的,电气的特性也决定了线路的连接方式,比如RS232,规定用电平表示数据,因此线路就是单线路的,用两根线才能达到全双工的目的;而RS485, 使用差分电平表示数据,因此,必须用两根线才能达到传输数据的基本要求,要实现全双工,必需用4根线。但是,无论使用RS232还是RS485,它们与UART是相对独立的,但是由于电气特性的差别,必须要有专用的器件和UART接驳,才能完成数据在线路和UART之间的正常流动。
         UART和RS232/RS485的关系是什么? - cp4 - Red Stone  Blue Sky

       RS232甚至规定了接口的具体样式,图为DB9接口

~
       总结:从某种意义上,可以说,线路上存在的仅仅是电流,RS232/RS485规定了这些电流在什么样的线路上流动和流动的样式;在UART那里,电流才被解释和组装成数据,并变成CPU可直接读写的形式。
~
~
      【注1】这里是例子是小端发送模式,是基本的串口传输方式,但是,大端模式的串口传输模式也是存在的,少见而已。
 
编程区别:
 
     Linux下串口编程沿袭了Unix的POSIX标准,编程时只要包含<termios.h>,然后调用tcgetattr tcsetattr等函数,就可以完成对串口波特率,启停位,校验方式等的设置。
          有人会问,这些设置里,看不到对RS232或者RS485的区分啊,对于这两种协议没有编程的区别吗?
          其实,看了我这篇 讲UART和RS232和RS485关系的文章的话,就会理解:RS232和RS485定义是电气特性,影响的是数据在线路上的传输过程,RS232和RS485的收发器通过UART才能被CPU访问,所以,只要控制了UART,就可以控制串口的传输方式,而所谓的编程其实就是对UART编程,所以RS232个RS485从程序员视角是不可见的。
          “那你就直接说RS485和RS232编程上没有区别不就完了?”
          问题是,实际总比理论复杂,这里有一种例外:
          RS232用两根线实现全双工,两根线各做各的,互不影响,可以同时进行;RS485虽然可以用四根线实现全双工,但是实际应用中比较少见,更常见的是只用两根线实现半双工,这样一来,就涉及到“收状态”和“发状态”的切换,这一切换又涉及两种情况:
          1、驱动程序中已经含有对半双工情况下的接受切换,驱动程序会根据你读或写的动作,自动进行切换。这种情况下,RS485的编程就与RS232完全没有区别。
          2、驱动程序不带自动切换,此时,为了完成切换,必须使用额外的GPIO连接RS485收发模块的接受使能端,在接受、发送数据之前,首先对使能端置位,使之处于正确的“接收”或“发送”状态。

 

目录
相关文章
|
9月前
|
芯片
串口、COM口、RS232、RS485、USB区别
串口、COM口、RS232、RS485、USB区别
383 0
|
4月前
|
Rust JavaScript 前端开发
Rspack 学习了解
Rspack 学习了解
50 0
|
8月前
|
芯片
UART、RS232、RS422和RS485解读
UART、RS232、RS422和RS485解读
301 0
|
11月前
|
存储 Rust JavaScript
初识 NAPI-RS
初识 NAPI-RS
152 0
|
12月前
|
芯片 异构计算
labview的RS232驱动程序
labview的RS232驱动程序
102 0
|
缓存
03ZSTL6-00-201-RS 指令和数据可能有不同的缓存
03ZSTL6-00-201-RS 指令和数据可能有不同的缓存
65 0
03ZSTL6-00-201-RS 指令和数据可能有不同的缓存
|
程序员
03ZSTI2-00-501-RS 可读版本之间的直接映射
03ZSTI2-00-501-RS 可读版本之间的直接映射
68 0
03ZSTI2-00-501-RS 可读版本之间的直接映射
03ZSTI7-00-402-RS 为了让执行它的CPU解决一个问题
03ZSTI7-00-402-RS 为了让执行它的CPU解决一个问题
64 0
03ZSTI7-00-402-RS 为了让执行它的CPU解决一个问题
UART,RS232,RS485串口等区别
UART,RS232,RS485串口等区别
178 0
|
Java 数据库连接
java使用jdbc连接ResultSet通过next()取不到第一条数据
java使用jdbc连接ResultSet通过next()取不到第一条数据
256 0

热门文章

最新文章