转载自:http://www.cnblogs.com/chineseboy/archive/2013/03/06/2947173.html
前题:
前段时间,在公司调试了一个项目,很简单,但对于初学的我来说,有点难。经过一周多两周的时间,刻骨铭心,深深的印入我的脑海,特此整理---那就是关于串口的那些事儿。串口那一堆的事儿,总是和rs485,usart,uart,rs232,rs422搞在一起,最后是你中有我,我中有你。如果说,会配置usart,但是不会配合rs485,在现实中基本会被笑话--而自己,就闹过这样的笑话,也被别人笑过。
一、rs485
rs485,*又称呼它为EIA-485。数据在其上流动的能量来源于缆线两端的电压差,就像高处的水留向低处一般。最早是采用双线制,一收一发,半双工模式,并且在收发转换的时候需要控制方向进行设定,这等同于安保科的呼呼机:按下按钮--说话;松开按钮--接听。<ps:如果收发转换不进行方向设定,那么收发不能成功>
rs485规定:高电平一端为逻辑1,低电平一端是逻辑0;两端的电压差最小为0.2V以上时有效,if (差值 <= 12V || 差值 >= -7V) {接收端会认为是有效的}。
rs485没有定义数据协议,适用于广域网和一发多收的通信链路;点对点网络中,线型,总线型,不能是星型,环型网络;行大面积长距离传输(超过4000英尺,1200米);一般都需要配备2个终端电阻,保护信号的正确纯净。
另外,一般说rs485是半双工模式,但这不是绝对的---用四线时可以和EIA-422一样实现全双工。
下图为rs485通信模块的一个芯片,也是我公司使用的,sp485:
ps:其中8为电源,5为接地,A为收数据端,B为发数据端,而内部的结构,决定了二线制的rs485为半双工模式;1脚和4脚相对于A和B进行数据的收发;2和3,可以焊接到一起,进行rs485收发方向的控制。
二、rs422
一说rs485,于是就几乎马上带出rs422,*又名EIA-422。何为rs422?感觉其实就是两个rs485拼起来的;采用4线,全双工,差分传输,多点通信的数据传输协议;通常用途是作为RS-232的扩展。在网上摘到的rs422设计图如下:<也感谢提供图的作者>
三、rs232
rs232,*又名EIA232;第一次听说它,总是把它想成了rs485那么简单,传输数据也应该学rs485那样。等看过了它的真正实现原理,突然发现,它其实最像<或者说就是>usart、uart!
最常用的编码格式是异步起停(asynchronous start-stop)格式,它使用一个起始比特后面紧跟7或8 个数据比特(bit),然后是可选的奇偶校验比特,最后是一或两个停止比特。
定义了逻辑一和逻辑零电压级数,以及标准的传输速率和连接器类型。信号大小在正的和负的3-15v之间;RS-232规定接近零的电平是无效的,逻辑一规定为负电平;有效负电平的信号状态称为传号marking,它的功能意义为OFF,逻辑零规定为正电平,有效正电平的信号状态称为空号spacing,它的功能意义为ON。
下图是其定义图<来自网络,感谢提供者!>
四、usart<简称串口了>
这个是部分应该是自己详细总结的地方。也是上面种种的基础。
1、我所理解的usart数据传输的方式,一份数据<一个字节>,经过usart打包处理后,传输给对方的usart,然后经过对方的usart解包处理后,把这个数据送达到目的地,等同于现实中的快递。而这个打包的过程,就是在该数据的前面加上起始位,在后面加上校验位和终止位等东西,然后一并通过缆线传送到对方--快递也是一样的,东西经过快递员打包后,连着包裹,一块儿送达到别人家。而用户要传送的这份数据为一个字节<8bit,也有需要的定义成了9bit>。而缆线可不管你是多少,它就只是按010110的传送过去了。<这点是自己开始想不明白的地方:为啥usart一次只能穿送一个字节,但是数据量却是11位?>
2、串口属性的理解<波特率,校验值,停止位,起始位的配置>:还是以快递为理解,显示中投寄物品,都需要写明是走航空运输还是普通运输,是加急快递还是普通邮寄,是否需要保单等等信息;而usart串口一样的,只有双方的串口属性相同,它们传输的数据才会正确。
3、串口的通信方式:轮询--不停的去看,去查看来数据没、数据发送出去了没;中断,数据操作完成给cpu一个中断信号。DMA---大量数据的移动,不经过cpu的干预,只是注意要配置好DMA数据操作的方向。
4、串口的使用:很简单,首先你得按照对方串口属性,给己方串口配置成相同属性;然后使能。如果是采用中断方式通信,可千万别忘记了开中断。
5、对串口数据的提取或者将大量数据存放进串口,然后往外发送--有时候需要对串口数据进行人工处理:比如我的工作就是干这事儿。一个方法是,定义一个接收缓冲区,比如 RxBuf[256],采用中断方式接收数据,那么接收中断来一次,则往该缓冲区存放一个字节的数据;然后再从该缓冲区把数据读到某个地方去进行处理--注意,从缓冲区读数据的时候要关闭接收中断,读操作完成后再使能接收中断。发送数据时则相反而已。另外一个方式是,直接在接收中断操作函数里面就把接收到的数据进行处理,这样可以精简一定量的代码,但是得依照实际情况而定。
6、串口、rs485、stm32的GPIO口,它们都是连在一起的。属于串联格式。串口挂在GPIO口上,那是为了节省I/O的原则,这也是stm32设计的一大亮点。下图附上我公司相关电路图部分截图,相关实现代码放在下一篇日志里了。
其中U2为stm32最核心的那个东东。最后再次提醒:使用rs485,切记切记设定485的控制方向,也就是图中的rs485 DIR;通过在GPIO上的控制<rs485DIR <--> USART2 DIR <--> PA1>,至于74HCT244D没多大影响的,485的数据到串口上,可以无视该芯片了。