以前没有实际接触过串口编程, 基础知识也缺乏, 所以突击学习了一下. 但在flow control这块, 花了很长时间, 看了很多文档, 多数含糊不清, 甚至相互矛盾.
最后, 终于找到一个教程, 讲解的很全面, 还有接线方式介绍.
http://netcourse.cug.edu.cn/NCourse/weixingjisuanji/content/chapter4/4-3/4-3-2.htm
现在抄录几个重要的点:
1.电气特性
EIA-RS-232C, 采用如下电平规定:
在TxD和RxD上:逻辑1(MARK)=-3V~-15V
逻辑0(SPACE)=+3~+15V
在RTS、CTS、DSR、DTR和DCD上:
信号有效(接通,ON状态)=+3V~+15V
信号无效(断开,OFF状态)=-3V~-15V
2.连接器的机械特性:
主要有DB-25和DB-9两种, 最常用的是DB9, 其标准的引脚定义如下.
但需要注意的是, 并不是所有的RS232端口都采用标准的引脚, 比如有些DB9的TX是2号, RX是3号. 下面是DB9信号分类和方向.
3. 联络控制信号线, 即硬件 Flow control:
数据装置准备好(Data set ready-DSR)——有效时(ON)状态,表明DCE通讯设备(比如MODEM)处于可用的状态。
数据终端准备好(Data set ready-DTR)——有效时(ON)状态,表明DTE数据终端(比如PC机)可用。
这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。
请求发送(Request to send-RTS)——用来表示DTE向DCE发出发送数据请求,即当终端要发送数据时,使该信号有效(ON状态)
允许发送(Clear to send-CTS)——用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当MODEM已准备好接收终端传来的数据,将使该信号有效,通知终端开始沿TxD线发送数据。
4. 流控制.
通讯双方需要保证传输的可靠性, 流控制和校验位是2种保证可靠性的机制. 流控制分为硬件流控制和软件流控制. 硬件流控制又可包含rts/cts控制和dtr/dsr控制. dtr/dsr是粗粒度的控制, 表明设备是否准备好了. cts/rts是细粒度控制, 表明buffer区是否太满或太空了.
硬件流控制, 必须要将对应的电缆线接上. 在工控设备上, 因为通讯数据量往往并不多, 两端的处理速度一般都很快, 所以多数情况下, 没有必要严格将两种硬件流控方式都用上, 有的做了些变通, 有的甚至完全取消硬件流控, 这样做的好处是, 接线会简单, 线缆成本也降低了.
rts/cts硬件流控的握手过程是: 接收端根据缓存区大小, 设置一个高位标志和低位标志, 高位值通常是 buffer 的75%, 低位值通常是buffer的25%. 当接收区数据到达高位值后, 接收端置cts为低电平, 即逻辑0, 发送端接检查到cts为低后, 就停止发送数据, 知道接收端buffer内的数量低于低位值后, 重新将cts置为高电平. rts是用来标记接收设备有没有准备好接收数据.
软件流控制由于电缆线的成本,有时候不采用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送 端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或 Control-Q), 发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。应该注意,若传输的是二进制数据, 标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。
5. 接线方法.
带modem通讯多运用在长距离通讯上. 对于工控设备之间的通讯, 多是null modem方式
零Modem接线法, 即常说的交叉接线法, 变种比较多, 具体采用哪种接线方式, 要看两设备有没有采用hardware flow control, 以及采用流控严格不严格. 另外, 现场中还可以看到cable是直连接线法, 多数是因为有一端串口是非标准的, 比如有些九针的第2个引脚是Tx, 第3个是Rx.
下面是这些接法图, (注意: 引脚编号是DB25端口的编号), 前两种方法, 根本使用硬件流控, 后两种方法其实也仅仅是使用了dtr/dsr流控.
6. 单工、半双工和全双工的定义
如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。
如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。