串口UART
文章主要是为方便自己记录问题和重点;
主要是基于RS232的描述;
一、串口理论知识:
1、串口按位(bit)发送和接收字节,尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信(rs232理论距离可以传输15m);
2、由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据,没有时钟的概念,完全依赖波特率、数据位、停止位和奇偶校验去解析数据,两个串口通信时,这4个参数要匹配;
3、波特率:单位时间内载波参数变化的次数;数据位:实际数据位的参数,串口通信中一般设置为8位;停止位:用于表示单个包的最后一位;奇偶校验位:在串口通信中一种简单的检错方式;
4、串口通信的效率计算:举例:波特率9600,数据位8,停止位1,校验位1,则每秒传输的有效字节数:9600bit/(数据位8bit+1bit停止位+1bit校验位)/8BYTE=960bit/8BYTE=120字节;
5、UART和RS232及RS485的区别在于UART是一种接口,而RS232/RS485是一种总线。UART这个接口,后面可以接TTL电平,这就是我们俗称的普通的串口。而UART如果接了RS232/RS485的转换芯片,那么后面的总线上就是按照RS232/RS485规则来传输数据。RS232/RS485总线的具体规则我们后续再讨论,本篇主要详解TTL下的情况。UART接TTL电平时,+5V等价于逻辑“1”,0V等价于逻辑“0”。
UART、RS232、RS485在串口通信中,主要区别是电平的不同;
其中UART通常使用TTL电平
TTL全名是晶体管-晶体管逻辑集成电路(Transistor-Transistor Logic)
输入高电平最小2V,输出高电平最小2.4V,典型值3.4V;
输入低电平最大0.8V,输出低电平最大0.4V,典型值0.2V。
RS232
逻辑1电平(MARK)=-3V~-15V,
逻辑0电平(SPACE)=+3~+15V;
RS485
RS485是差分信号进行串行传输;
逻辑1以两线间的电压差为+(2~6)V表示;
逻辑"0"以两线间的电压差为-(2~6)V表示;
二、对比下RS232和RS485的相关知识
1、RS232硬件接口:通常RX+TX+GND地;RS485的硬件接口:485_RX+485_TX+485_RE+485_DE,其中RE+DE是用于控制发送或接收的接口;
2、RS232和RS485的差异: RS232是用的TTL电平通信,485用的是差分信号进行通信;
RS232只能是点对点的进行通信,RS485可以一对多进行通信;
RS232是全双工的通信,RS485是半双工的通信;
RS232通信距离可能只能达到15M,RS485通信距离可以达到1200M;
RS232速率通常比较慢,只可达20kbps,RS485速率通常比较快,可达10Mbps(其实很少用这么高的速率进行通信);
3、RS232和RS485的共同点: RS232和RS485都是异步通信的,都是无时钟的;所以通信的双方,需要设置一样波特率、位数、校验位、停止位等;
三、软件开发的思路:
1、管脚功能配置;
2、linux需要存在设备节点(需要串口驱动的支持,一般内核里都会打开,但碰到过海思芯片,串口2需要修改内核使能uart2,现在通常使用设备树,只需要设备树里打开即可);
3、STM32需要配置相应的时钟(STM32,需要特别注意这一点);
4、配置参与串口通信双方的波特率、数据位、停止位、校验位;
5、部分芯片中RX、TX需要添加上拉电阻;(如海思对接STM32芯片)
6、RS485是差分信号,可以对接多个设备,其中有所谓的4线模式(其实就是点对点了,实现实时双向通信);
四、串口排查过哪些通信相关的问题:
1、海思芯片内核中uart2没有使用,在kernel里配置打开uart2,现在内核通常是使用设备树了,只需要在设备树里打开即可;
2、STM32两边的奇偶校验位设置不匹配,现象:接收的数据类似是移了一位;
3、STM32与海思不通,原因:RX和TX没有交叉连接;
4、STM32通信中,位数实际为8时,需要设置为9(记不清楚了);
5、碰到过rv1126中波特率设置成150000,这种比较少见的波特率;
串口通信只是第一步,重要的是通信的内容或者自定义的协议;
串口相关的代码:百度网盘:work/硬件协议/UART串口通信协议(linux的参考代码)