串口通信总结

UART:universal asynchronous receiver and transmitter通用异步收/发器

USART:universal synchronous asynchronous receiver and transmitter通用同步/异步收/发器

UART:通用异步收发器,全双工串行异步通信,由发送器,接收器,控制单元,波特率发生器等组成。

                                                           UART的组成

串口通信总结_第1张图片

波特率就是发送二进制数据位的速率。

数据传输格式

串口通信总结_第2张图片

空闲位: 从一个字符的停止位结束到下一个字符的起始位开始,表示线路处于空闲状态,为逻辑 1。

起始位:必须是持续1bit时间的逻辑 0 电平,标志着传输一个字符的开始,接收方可用起始位使自己的接收时钟与发送方的数据同步。

数据位:紧跟在起始位之后,是通信中的真正有效信息。数据位的位数可以由通信双方共同约定,一般可以是5位、6位、7位或8位,标准的ASCII码是0~127(7位),扩展的ASCII码是0~255(8位)。传输数据时先传送字符的低位,后传送字符的高位。

通信方式

短距离可以通过TTL来通信

串口通信总结_第3张图片

超过1m就应该外接电平转换接口,如RS=232,RS-485,RS-422等。

RS232 电平
逻辑1:-3V~-15V
逻辑0:+3V~+15V


TTL 电平   输出:                             输入:
                 逻辑1:》2.4                   逻辑1:》2.0
                 逻辑0:《0.8                   逻辑0:《1.2

RS-232和UART究竟是什么关系?为什么又了UART还要RS-232

虽然RS-232三个引脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机对连通信,这是为什么呢?

不是所有的电路都是 5V 代表高电平而 0V 代表低电平的。对于 RS232 标准来说,它是个反逻辑,也叫做负逻辑。为何叫负逻辑?它的 TXD 和 RXD 的电压, -3V~-15V 电压代表是 1, +3~+15V 电压代表是 0。低电平代表的是 1,而高电平代表的是 0,所以称之为负逻辑。

因此RS232串口是不能和单片机直接连接的,需要用一个电平转换芯片 MAX232 来完成,如图所示。
                串口通信总结_第4张图片

这个芯片就可以实现把标准 RS232 串口电平转换成我们单片机能够识别和承受的 UART0V/5V 电平。从这里大家似乎慢慢有点明白了,其实 RS232 串口和 UART 串口,它们的协议类型是一样的,只是电平标准不同而已,而 MAX232 这个芯片起到的就是中间人的作用,它把 UART 电平转换成 RS232 电平,也把 RS232 电平转换成 UART 电平,从而实现标准 RS232接口和单片机 UART 之间的通信连接。

 

 

RS232和RS485

RS232

(1)接口标准

RS-232是美国电子工业联盟(EIA)制定的串行数据通信的接口标准,原始编号全称是EIA-RS-232(简称232,RS232)。它被广泛用于计算机串行接口外设连接。最远传送15m。

(2)常见连接器

常见的有 DB9 和 DB25,并且连接器分公/母头。

RS232相对于RS485有几处不足的地方:
1、 接口的信号电平值较高,达到十几 V, 使用不当容易损坏接口芯片, 电平标准也与TTL 电平不兼容。
2、 传输速率有局限,不可以过高,一般到一两百千比特每秒(Kb/s)就到极限了。
3、 接口使用信号线和 GND 与其它设备形成共地模式的通信,这种共地模式传输容易产生干扰,并且抗干扰性能也比较弱。
4、 传输距离有限,最多只能通信几十米。
5、 通信的时候只能两点之间进行通信,不能够实现多机联网通信。
总结:速率低,抗干扰弱,距离端,点到点

RS485

采用差分传输,

  • 电平1:A的点位比B高200mV以上时
  • 电平1:B的点位比A高200mV以上时

面试遇到的串口通信问题

设计一个串口收发异步的程序。
要求:自定义数据包,请注意,对不同时刻的包到来如何解析?对同一数据包分次到来如何解析;

串口通信速度不快,而且对计算机来说已淘汰串口了,就是硬件也是很少用只用在数据量不大而且通信速度不快的场合.所以这不过是考你制定协议,并不是主要考你串口方面的知识.
1.对不同时刻的包到来如何解析
通过每个包的ID号(也可以叫命令号,命令码,反正怎么叫都行,就是区别不同的数据包)来区别并解析
2,对同一数据包分次到来如何解析
根据一个完整数据包的长度及校验字来解析,也可以再加上断点识别关键字,就是在每一个数据里加上起始帧,连续帧,结束帧的关键字,当接收到结束帧的报文后就认为接收到一个完整的报文

如何判断两个串口未知的波特率?

我现在想编一个通用型串口接收程序,当一个未知设备与计算机相连时:1、程序能自动检测与该设备相连的计算机串口端口号 2、自动搜索未知设备的通信波特率。

第一个功能很容易实现,就是首先搜索计算机可用端口,然后挨个打开可用端口分别定时1.5秒,有数据进来的则判断是与设备相连的端口。现在的问题是第二个自动搜索未知设备的通信波特率功能不知道怎么实现,我的初步想法有:
1、将波特率遍历2400、4800、9600、19200、38600和57600,给每个波特率定时1.5秒,对收到的ASCII码进行分析,小于127的认为是正常的字符,大于127的是乱码,当正常字符数目>=10倍乱码数目则认为当前波特率为正确波特率,并终止往后搜索;
2、根据经验判断未知设备1秒发送的字符数目,比如大概是50个左右,那么我就将波特率遍历2400、4800、9600、19200、38600和57600,给每个波特率定时1秒,对收到的ASCII码进行分析,总字符数在4-6之间时认为是正确的波特率,这种方法缺乏通用性。

串口如何发送浮点类型数据

思路:将多字节浮点数据分解成单字节逐个发送,接收后组合还原;
可以使用共用体

union{//假设浮点和长整形均为4字节
    float angleX;
    unsigned long bs;
}data;
data.angleX = 123.456;

发送时发4字节

TX = (uchar)bs; //低8位
TX = (uchar)(bs>>8);
TX = (uchar)(bs>>16);
TX = (uchar)(bs>>24);//高8位

接收端也定义同样的共用体,接收4字节

union{
    float angleY;
    unsigned long bs_Rx;
}data_Rx;
bs_Rx = RX ; //低8位
bs_Rx |= RX <<8;
bs_Rx |= RX <<16;
bs_Rx |= RX<<24;//高8位

最后angleY的值是等于angleX的;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(嵌入式)