串口通讯简单回顾

最近几个小项目都是与串口有关的,前段时间用C++实现了一个串口通讯类,高效稳定,效果还不错;后来由于一个同事用C#的SerialPort类与设备通讯时效率很低,让我帮他自己包装了一个C#的Comm通讯类。

串口通讯中对串口的设置基本上很简单,大部分时候只需要设置串口号和波特率、数据位、停止位,其他的很少改动,默认就行了。

在使用C#与设备通讯时,发现一个比较贵的USB转串口线通讯速度不稳定,至少前面几分钟速度会非常的慢,之后就恢复正常了。但是用sscom32调试助手看却很快,所以怀疑打开串口的时候是不是对其他几个参数的设置上的区别导致通讯速度的不同?更奇怪的是另一根相当便宜的USB转串口线,在任何情况下速度都很正常,汗……

简单讲解

串口是计算机上一种非常通用的通信设备,大多数计算机包含两个基于RS232的串口,由于其使用简单造价低廉而被普遍应用。

奇怪的是近几年出产的笔记本和PC机基本都没有串口这种设备了,而简单易用、成本低廉的特性,让很多硬件设计工程师还是选择了串口作为设备与其他设备的通讯方式。因此,usb串口转换线使用的非常多,它的RS232-485接口连接串口设备,另一端转换为USB接入PC等上位机,在上位机上模拟出多个串口,以实现PC机通过串口与外围串口设备通讯。

串口通信的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。而IEEE488定义规定,对于并行通讯,设备线总常不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。

典型地,串口用于ASCII码字符的传输。通信使用3根线完成:(1)地线,(2)发送,(3)接收。由于串口通信是异步,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但是不是必须的。

串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通行的端口,这些参数必须匹配。

高深一点,通讯过程中的硬件知识

由于 CPU 与接口之间按并行方式传输,接口与外设之间按串行方式传输,因此,在串行接口中,必须要有“接收移位寄存器” (串→并)和 “发送移位寄存器 ”(并→串)。在数据输入过程中,数据 1 位 1 位地从外设进入接口的 “接收移位寄存器” ,当“接收移位寄存器”中已接收完 1 个字符的各位后,数据就从“接收移位寄存器”进入“数据输入寄存器”。CPU 从“数据输入寄存器”中读取接收到的字符。(并行读取,即 D7~D0 同时被读至累加器中)。“接收移位寄存器”的移位速度由“ 接收时钟”确定。

在数据输出过程中,CPU 把要输出的字符(并行地)送入“数据输出寄存器”,“数据输出寄存器”的内容传输到“发送移位寄存器”,然后由“发送移位寄存器”移位,把数据 1 位 1 位地送到外设。“发送移位寄存器”的移位速度由“发送时钟”确定。

接口中的“控制寄存器”用来容纳 CPU 送给此接口的各种控制信息,这些控制信息决定接口的工作方式。

“状态寄存器”的各位称为“状态位”,每一个状态位都可以用来指示数据传输过程中的状态或某种错误。例如,用状态寄存器的 D5 位为 ‘1’ 表示“数据输出寄存器”空,用 D0 位表示“数据输入寄存器满”,用 D2 位表示“奇偶检验错”等。

实际上,上面所说的”串→并”转换的功能由一块叫UART(Universal Asynchronous Receiver and Transmitter)的芯片完成,典型的芯片有: Intel 8250/8251,16550。

从电气特性上说,串口就使用接收线和发送线传输数据。无论是发送还是接收一个逻辑1,发送或者接收线被置成了低电压,相反,如果是逻辑0,则被置成了高电压。当传输一个字节时,UART首先发送一个‘开始位’,为逻辑0,即,高电压,然后是数据位(通常是8位,当然也可以设置成5、6或者7位,上位机通常以一个字节为单位来处理串口数据的,所以,如果不想给自己找麻烦,或者不想被人看的很高深,还是老老实实用默认的8位吧:-)。PS:前两天用串口通讯,发现接收到的数据总是不大于127,原因就是在用C#定义DCB结构体时把几个flag定义错了,导致覆盖到了数据位的标志位为7,所以肯定完蛋,把第8为当成了下一个字节的起始标示位了),最后接着来的是1位或者两位停止位,是逻辑1,即低电平。这样,一个字节就传输出去了,其它字节依次周而复始。

上个图给你look look,应该就很形象了:

流控制:XON/XOFF

到这里就有点复杂了,一般情况下没必要了解,如果很好奇,那就看看,毕竟了解的越多,动起手来才得心应手!

下面的文字来自网络,讲的很清楚,直接摘了:
XON/XOFF 是一种流控制协议(通信速率匹配协议),用于数据传输速率大于等于1200b/s时进行速率匹配,方法是控制发送方的发速率以匹配双方的速率。
XMODEM是一种低速文件传输协议。KERMIT是异步通信环境中使用的一种文件传输协议。它与XMODEM的主要区别是:KERMIT一次可传送多个文件,而XMODEM一次只能传送一个文件;KERMIT在接收方以完整的信息包应答,而XMODEM以单字节应答;KERMIT提供多种错误校验技术,而XMODEM只提供一种错误校验技术。
在流量控制方面,可以从不同侧面采取不同的控制方案。最简单的方法就是增加接收端的缓冲存储空间,使得接收端可以缓存更多的数据。但这只是一种被动、消极的方法。因为,一方面系统不允许开设过大的缓冲空间;另一方面对于速率显著失配,并且又传送大量数据的场合,即使缓存空间再大也会出现不够的现象。目前普遍采取一种称之为“XON/XOFF”的发送控制字符的方案,通过控制字符来确定发送方是否继续发送数据,相比之下更主动、更积极、更有效。
XON/XOFF(继续/停止)是异步串行连接的计算机和其他元件之间的数据流控制协议。例如,计算机向打印机发送数据的速度通常快于打印机打印的速度,打印机包含一个缓冲器,用来存储数据,使打印机能够赶上计算机。如果在打印机赶上之前缓冲器变满了,打印机的小微处理器便发回一个XOFF信号来停止数据传送,打印完相当多的数据,缓冲存储器变空时,打印机发送XON信号,让计算机继续发送数据。“X”表示“发送器”,X/ON和X/OFF为开启和关闭发送器的信号。X/ON的实际信号为ASCII的Ctrl-Q键盘组合的位组合,X/OFF信号为Ctrl-S字符。在为计算机操作系统定义调制解调器时,可能需要用XON/XOFF或CTS/RTS来指定流控制的使用。在发送二进制数据时,XON/XOFF可能不能识别,因为它被译成了字符。
XON/XOFF是一种异步通信协议,接收设备或计算机使用特殊字符来控制发送设备或计算机传送的数据流。当接收计算机不能继续接收数据时,发送一个XOFF控制字符告诉发送方停止传送;当传输可以恢复时,该计算机发送一个XON字符来通知发送方。其中XON采用ASCII字符集中的控制字符DC1,XOFF采用ASCII字符集中的控制字符DC3。当通信线路上的接收方发生过载时,便向发送方发送一个XOFF字符,发送方接收XOFF字符后便暂停发送数据;等接收方处理完缓冲器中的数据,过载恢复后,再向发送方发送一个XON字符,以通知发送方恢复数据发送。在一次数据传输过程中,XOFF、XON的周期可重复多次,但这些操作对用户来说是透明的,也就是说用户不用管它。
许多异步数据通信软件包均支持XON/XOFF协议。这种方案也可用于计算机向打印机或其他终端设备(如MODEM的串行通信)发送字符,在这种情况下,打印机或终端设备中的控制部件用以控制字符流量。

发表评论

电子邮件地址不会被公开。