UART/RS232串口通讯协议解析

概述

通用异步收发传输器(Universal Asynchronous Receiver/Transmitter),通常称作UART。它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。 具体实物表现为独立的模块化芯片,或作为集成于微处理器中的周边设备。一般是RS-232C规格的,与类似Maxim的MAX232之类的标准信号幅度变换芯片进行搭配,作为连接外部设备的接口。在UART上追加同步方式的序列信号变换电路的产品,被称为USART(Universal Synchronous Asynchronous Receiver Transmitter)。

接口

在UART通信中,两个UART直接相互通信。发送UART将来自CPU等控制设备的并行数据转换为串行形式,并将其串行发送到接收UART,接收UART然后将串行数据转换回接收设备的并行数据。数据从发送UART的Tx引脚流向接收UART的Rx引脚,硬件连接比较简单,仅需要3条线,如果两个设备UART电平不一致需要转换电平再连接。

TX - 数据发送接口 RX - 数据接受接口 GND - 保证两设备共地,有统一的参考平面 在这里插入图片描述

通信协议

UART串口传输的数据被组织成数据包。每个数据包包含1个起始位,5至9个数据位,可选的奇偶校验位和1或1.5或2个停止位,协议如下: |起始位|数据位 |奇偶校验位|停止位| |--|--|--|--| | 1bit | 5-9bit |0-1bit | 1-2bit | 空闲位 :UART协议规定,当总线处于空闲状态时信号线的状态为'1’即高电平,表示当前线路上没有数据传输。

起始位 :开始进行数据传输时发送方要先发出一个低电平’0’来表示传输字符的开始。因为总线空闲时为高电平所以开始一次通信时先发送一个明显区别于空闲状态的信号即低电平。

数据位 :起始位之后就是要传输需要传输的数据,数据可以是5,6,7,8,9位,构成一个字符,一般都是8位。先发送最低位最后发送最高位,使用低电平表示'0’高电平表示'1’完成数据位的传输。 奇偶校验位 :数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。校验位其实是调整个数,串口校验分几种方式:

  1. 无校验(no parity)

  2. 奇校验(odd parity):如果数据位中“1”的数目是偶数,则校验位为“1”,如果“1”的数目是奇数,校验位为“0”。

  3. 偶校验(even parity):如果数据为中“1”的数目是偶数,则校验位为“0”,如果为奇数,校验位为“1”。

  4. mark parity:校验位始终为1(不常用)。

  5. parity:校验位始终为0(不常用)。

停止位 :数据结束标志,可以是1位,1.5位,2位的高电平。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备之间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟的机会。停止位个数越多,数据传输越稳定,但是数据传输速度也越慢。 传输方向 :即数据是从高位(MSB)开始传输还是从低位(LSB)开始传输。

波特率

电子通信领域,波特(Baud)即调制速率,指的是有效数据讯号调制载波的速率,即单位时间内载波调制状态变化的次数。 波特率表示每秒钟传送的码元符号的个数,它是对符号传输速率的一种度量,它用单位时间内载波调制状态改变的次数来表示,1波特即指每秒传输1个符号。 数据传输速率使用波特率来表示。单位bps(bits per second),常见的波特率9600bps、115200bps等等,其他标准的波特率是1200,2400,4800,19200,38400,57600。举个例子,如果串口波特率设置为115200bps,那么传输一个比特需要的时间是1/115200≈8.68us。

 

示例

设置115200,传输单个0x62的数据,使用示波器抓得的波形如下所示。 在这里插入图片描述 上图是uart协议传输一个0x62的数据,通过示波器的uart解码而得到的波形示意图,由于未设置奇偶校验位,故在上图未显示出来;比特流格式为LSB,故从低位开始传输,接收数据为0100 0110,实际的数据应该反过来,即0110 0010(0x62)。

设置115200,传输0x55,0xAA,0x03等多个数据时,使用示波器抓得的波形如下所示。 在这里插入图片描述

上图是uart协议传输0x55,0xAA,0x03等多个数据,通过示波器的uart解码而得到的波形示意图,由于未设置奇偶校验位,故在上图未显示出来,设置的停止位为1位;比特流格式为LSB,故从低位开始传输,接收三个数据分别为1010 1010、0101 0101、1100 0000,实际的数据应该反过来,即0101 0101(0x55)、1010 1010(0xAA)、0000 0011(0x03)。

 

  1. 根据波特率计算一个bit宽度,比如串口波特率115200bps,1/115200≈8.68us

  2. 抓取波形(最好发送55或者AA),uart为3.3V电平,transceiver为-3V~-15V  ,+3~+15V,且电平翻转

  3. 得出8位数据位,根据ASCII码转换表得出16进制位数据

posted @ 2024-11-05 16:17  咸鱼书生  阅读(72)  评论(0编辑  收藏  举报