Linux串口编程详解
串口本身,标准和硬件 ?
串口是计算机上的串行通讯的物理接口。计算机历史上,串口曾经被广泛用于连接计算机和终端设备和各种外部设备。虽然以太网接口和USB接口也是以一个串行流进行数据传送的,但是串口连接通常特指那些与RS-232标准兼容的硬件或者调制解调器的接口。虽然现在在很多个人计算机上,原来用以连接外部设备的串口已经广泛的被USB和Firewire替代;而原来用以连接网络的串口则被以太网替代,还有用以连接终端的串口设备则已经被MDA或者VGA取而代之。但是,一方面因为串口本身造价便宜技术成熟,另一方面因为串口的控制台功能RS-232标准高度标准化并且非常普及,所以直到现在它仍然被广泛应用到各种设备上。 某些计算机使用一个叫做UART的集成电路来作为串口设备。这个集成电路可以进行字符和异步串行通讯序列之间的转换,并且可以自动地处理数据的时序。而某些低端设备则会让CPU直接通过输出针来传送数据,这种技术叫做bit-banging。 因为“串口”,RS-232和UARTs基本上总是在同一个语境中出现,所以这些名词通常会被搞混。下面逐一解释以下一些重要的名词和术语。
↑
什么是串行通信 ?
计算机可以每次传送一个或者多个位(bit)的数据。“串行”指的式每次只传输一位(1bit)数据。 当需要通过串行通讯传输一个字(word)的数据时,只能以每次一位的方式接收或者发送。每个位可能是on(1)或者off(0)。很多技术术语中经常用mark表示on,而space表示off。 串行数据的速度通常用每秒传输的字节数bits-per-second(bps)或者波特率(baud)表示。这个值表示的是每秒钟被送出的0和1的个数。很久很久以前,300bps就是很快的速度了,而现在的电脑可以处理高达430,800的RS-232速率。表示波特率的单位还有kpbs和Mbps,1kps=1000bps而1Mbps=1000kbps。 一般有人提到串行设备的时候,它通常说可能是某种数据通讯设备-DCE(Data Communications Equipment)或者数据终端设备-DTE(Data Terminal Equipment)。它们之间的区别非常简单,每个信号对,比如传送和接收,它们俩正好是相反的。如果需要将两个DTE或者DCE设备连接起来的话,需要适配器或者交叉线缆将信号对交换。
↑
什么是RS-232 ?
RS-232是EIA(Electronic Industries Association)定义的串行通信的电器接口。RS-232事实上有三种(A,B和C),它们分别采用不同的电压来表示on和off。最被广泛使用的是
RS-232C,它将mark(on)比特的电压定义为-3V到-12V之间,而将space(off)的电压定义到+3V到+12V之间。虽然RS-232C标准说信号最远被传输8m,但事实上你可以使用它传输更长的距离,直到信号波特率已经小到不行了为止。 RS-232的连结线中除去用来传入传出数据的电线,还有一些用来提供时序,状态和握手的电线: RS-232 针脚定义 DB-25
针脚
针脚
针脚
针脚
针脚
描述 描述 描述 描述 描述
1
Earth Ground TXD -
DSR - 6
Data Set Ready GND - 7
Logic Ground DCD - 8
Data Carrier Detecter
Secondary TXD 13
Secondary CTS 12
Secondary DCD
11 Unassigned 16
Secondary RXD
Signal 21 Quality
Detect
2 Transmitted Data RXD -
17
Receiver Clock
22 Ring Detect
3 Received Data RTS -
18 Unassigned 23
Data Rate Select
4 Request To Send CTS - Clear To Send
9 Reserved 14 19
Secondary RTS DTR - Data
24
Transmit Clock
5 10 Reserved 15
Transmit Clock
20 Terminal
Ready
25 Unassigned
DB-9
针脚 名称 全名 3 2 7 8 6 4
TD RD
Transmit Data Receive Data
方向(主机 外设) -> <- -> <- <-
RTS Request To Send CTS Clear To Send DSR Data Set Ready
DTR Data Terminal Ready ->
1 9 5
CD RI -
Data Carrier Detect Ring Indicator Signal Ground
<- <-
另外两个比较常见的串行接口的标准式RS-422和RS-574。RS-422使用更低的电压和差分信号,这样可以将传输距离扩张到300m。而RS-574定义了通常可以见到的用在电脑上的9针连接器和电压。
↑
信号定义 ?
RS-232标准定义了18个不同的串行通信的信号。而这些之中,仅仅有如下6个可以在UNIX环境中使用。
?
GND - Logic Ground
从技术角度讲,GND不能算是信号。但是没有它其他信号都不能用了。基本上,logic ground有点像一个参考电压,通过它来判断哪个电压表示正哪个电压表示负。
? TXD - Transmitted Data
TXD信号负载着从你的电脑或者设备到另一端(比如调制解调器)的数据。Mark范围的电压被解析成1,而space范围电压被解析成0。
? RXD - Received Data
RXD于TXD正好相反。它负载着从另一端的电脑或者设备上传到你的工作站的数据。Mark和space的解析方法于TXD一致。
? DCD - Data Carrier Detect
DCD信号通常来自串口连结线的另一端。这条信号线上的space电压表示另一端的电脑或者设备现在已经连接。但是,DCD信号线却不是总可以得到的,有些设备上有这条信号线,而有的则没有。
? DTR - Data Terminal Ready
DTR信号是你的工作站产生的,用以告诉另一端的电脑或者设备你已经是否已经准备好了。Space电压表示准备好了,而mark电压表示没有准备好。当你在工作站上打开串行接口时,DTR通常自动被设置位有效。
? CTS - Clear To Send
CTS则通常来自连结线的另一端。Space电压表示你可以从工作站送出更多的数据。CTS通常用来协调你的工作站和另一端之间的串行数据流。
?
RTS - Request To Send
如果RTS信号被设置成space电压,这表示你准备好了一些数据需要传送。和CTS一样,RTS也被用来协调工作站和另一端的电脑或者设备之间的数据流。有些工作站上会一直将这个信号设置位space。
↑
异步通讯 ?
计算机为了弄懂传给它的串行数据,它需要确定每个字符开始和结束的位置。这通常是用异步串行数据来完成的。
在异步模式中,除非有字符被传输,否则串行数据线总是处于mark(1)状态。有一个start位会被加入传输字符的各个位之前,在字符本身的位之后会有一个可选的parity位和一个或者多个stop位。Start位总是space(0)并且它会告诉计算机新的串行数据过来了。数据可以随时被送出或者接收,这就是所谓的异步。
#ref(): File not found: \串口编程详解\
那个可选的parity位仅仅是所有传输位的和,这个和用以表示传输字符中有奇数个1还是偶数个1。在偶数parity中,如果有传输字符中有偶数个1,那么parity位被设置成0,而传输字符中有奇数个1,那么parity位被设置成1。在奇数parity中,位设置与此相反。还有一些术语,比如space parity, mark parity和no parity。Space parity是指parity位会一直被设置位0,而mark parity正好与此相反,parity会一直是1。No parity的意思就是根本不会传输parity位。 剩余的位叫做stop位。传输字符之间可以有1个,1.5个或者2个stop位,而且,它们的值总是1。传统上,Stop位式用给计算机一些时间处理前面的字符的,但是它只是被用来同步接收数据的计算机和接受的字符。 异步数据通常被表示成\,\,或者与此类似的形式。这表示“8数据位,no parity和1个stop bit”,还有相应得,“7数据位,even parity和1个stop bit”。
↑
什么是全双工和半双工 ?
全双工(Full duplex)是说计算机可以同时接受和发送数据——也就是它有两个分开的数据传输通道(一个传入,一个传出)。
半双工(Half duplex)表示计算机不能同时接受和发送数据,而在某一时刻它只能单一的传送或者接收。这通常意味着,它只有一个数据通道。半双工并不是说RS-232的某些信号不能使用,而是,它通常是使用了有别于RS-232的其他不支持全双工的标准。
↑
什么是流控制 ?
两个串行接口之间的传输数据流通常需要协调一致才行。这可能是由于用以通信的某个串行接口或者某些存储介质的中间串行通信链路的限制造成的。对于异步数据这里有两个方法做到这一点。
第一种方法通常被叫做“软件”流控制。这种方法采用特殊字符来开始(XON,DC1,八进制数021)或者结束(XOFF,DC3或者八进制数023)数据流。而这些字符都在ASCII中定义好了。虽然这些编码对于传输文本信息非常有用,但是它们却不能被用于在特殊程序中的其他类型的信息。
第二种方法叫做“硬件”流控制。这种方法使用RS-232标准的CTS和RTS信号来取代之前提到的特殊字符。当准备就绪时,接受一方会将CTS信号设置成为space电压,而尚未准备就绪时它会被设置成为mark电压。相应得,发送方会在准备就绪的情况下将RTS设置成space电压。正因为硬件流控制使用了于数据分隔的信号,所以与需要传输特殊字符的软件流控制相比它的速度很快。但是,并不是所有的硬件和操作系统都支持CTS/RTS流控制。
↑
什么是BREAK ?
通常,直到有数据传输时,接收和传输信号会保持在mark电压。如果一个信号掉到space电压并且持续了很长时间,一般来说是1/4到1/2秒,那么就说有一个break条件存在了。 BREAK经常被用来重置一条数据线或者用来改变像调制解调器这样的设备的通讯模式。
↑
同步通讯 ?
与异步数据不同,同步数据是一个稳定的字节流。为了能够在线路上读取到数据,计算机必须提供或者接受一个时钟,这样才能保证发送端和接收端同步。尽管已经有同步时钟,计算机还是必须以某种方式标志数据流的开端。做这件事情最常见的办法就是使用像Serial Data Link Control(\或者High-Speed Data Link Control(\这样的数据包通讯协议。 这些协议每个都定义了一个确定的比特序列来表示数据包的开始和结束。当然,它们也定义了一个用来表示没有数据传输的比特序列。这些比特序列可以帮助计算机识别数据包的开端。
因为同步协议可以不使用每个字符的同步比特位,所以通常它们的性能比异步通讯快最少25%,而且一般比较适用于远距离的网络链接或者有两个串口接口的配置的情况。尽管同步通讯的速度有优势,大部分RS-232硬件却不支持它,因为同步通讯需要其他的硬件和软件。