RS232串口 小記

  • 想搞清楚linux下的終端(Terminal)、設備IO,以及Windows下的設備IO(可提醒IO、IO完成端口等),似乎這個古老的RS232串口還真是一個不錯的切入點。所以,從基礎開始,看看串口。

注:聆聽Oswald Buddenhagen教誨,Windows首字符一定要大寫,否則M$可能會不高興的^_^

DTE與DCE

DTE

Data Terminal Equipment

數據終端設備

DCE

Data Circuit-terminating Equipment

數據通信設備

一直以來每理清這兩個是什麼東西,比如說,我用電腦通過232串口直接控制一個分子泵,那麼誰是DTE、誰是DCE?

而理不清這個,就渾渾噩噩,始終弄不明白那些串口引腳如何工作的。原來:二者都是DTE

在遠古時代,比如一個大型主機和一個終端設備進行通訊,二者之間需要調制解調器進行信號調製:

DTE <==> DCE <======...=====>DCE <==> DTE

而現在呢,我們使用的一般都是:

DTE <=====> DTE

不用於遠距離傳輸,沒有DCE什麼事了。彼此都認爲自己連接的都是DCE。

9針串口

  • RS-232C規標準接口有25條線,4條數據線、11條控制線、3條定時線、7條備用和未定義線,常用的只有9根

所以: 只關注目前還算很常見的 DE-9 pin 接口。假定是PC和一個modem相連。

名字

引腳(從PC角度)

信號起源

作用

DTD
Data Carrier Detect

1

DCE

已經連接成功

DTR
Data Terminal Ready

4

DTE

通知對方自己已經就緒

DSR
Data Set Ready

6

DCE

RI
Ring Indicator

9

DCE

振鈴

RTS
Request To Send

7

DTE

PC請求發送數據
設備應答

CTS
Clear To Send

8

DCE

TxD
Transmitted Data

3

DTE

數據收發

RxD
Received Data

2

DCE

GND
Common Ground

5

common

公共地

連線

只考慮兩個DTE連接的情況

3線

設備A

 

設備B

TxD

--->

RxD

RxD

<---

TxD

Gnd

----

Gnd

TxD與RxD交錯鏈接,Gnd直連。

當直接這樣連線時,可以更近一步,將自己的RTS與CTS、DSR與DTR分別連起來。

這樣一來:

設備A

 

設備B

TxD

--->

RxD

RxD

<---

TxD

Gnd

----

Gnd

RTS
 | 
v
CTS

 

RTS
 | 
v
CTS

DTR
 | 
v
DSR

 

DTR
 | 
v
DSR

效果就是,如果一方設置了硬件握手,發出握手請求的同時,就立即得到迴應(儘管我們自己知道這是假的)。

5線

設備A

 

設備B

TxD

--->

RxD

RxD

<---

TxD

Gnd

----

Gnd

RTS

--->

CTS

CTS

<---

RTS

加入了 RTS/CTS 握手。

7線

如果真的要多用一些線,可以使用7線鏈接。(接法不統一,這只是其中一種。當然,前面3線都不會有變化任何變化)

每個DTE可以發出3個信號TxD、RTS、DTR,加Gnd互聯,共7線。

設備A

 

設備B

TxD

--->

RxD

RxD

<---

TxD

Gnd

----

Gnd

RTS
 | 
v
CTS

--->

DCD

DCD

<---

RTS
 | 
v
CTS

DTR

--->

DSR
 | 
 | 
RI

DSR
 | 
 | 
RI

<---

DSR

這樣一來 DTR/DSR 硬件握手就可以正常工作了。

  • 當A方準備好,發出DTR信號,該信號直接聯至B的RI和DSR。即只要A準備好,B立即產生呼叫有效,並同時準備好。
  • A的RTS和CTS相連,並與B的DCD互連。即:一旦甲方請求發送(RTS),便立即得到允許(CTS),同時,使B的DCD有效,即檢測到載波信號

流向控制

硬件流控

  • RTS(Request To Send)/CTS(Clear To Send) 流控
  • DTR(Data Terminal Ready)/DSR(Data Set Ready) 流控

軟件流控

  • XON/XOFF

RTS/CTS

原本含義(主要是半雙工MODEM系統中發送方式和接收方式之間的切換):

  • RTS 用來表示DTE想DCE請求發送數據,即當終端要發送數據時,使該信號有效(ON),向MODEM請求發送。它用來控制MODEM是否要進入發送狀態。
  • CTS 用來表示DCE準備好接收DTE發來的數據,是對請求發送信號RTS的響應信號。當MODEM已準備好接收終端傳來的數據,並向前發送時,使該信號有效,通知終端開始沿發送數據線TxD發送數據。

後來的變化(全雙工):

  • CTS 不再是 RTS的響應,它用來表示DCE是否允許發送數據。

windows

DCB 相關成員:

fRtsControl

RTS_CONTROL_DISABLE 使得RTS保持off

RTS_CONTROL_ENABLE 使得RTS保持on

RTS_CONTROL_HANDSHAKE 啓用RTS握手

RTS_CONTROL_TOGGLE 根據有無數據可發送切換狀態

fOutxCtsFlow

是否根據CTS的狀態才確定數據收發

DTR/DSR

DTR/DSR 一般情況下始終爲ON,通常用來通知對方設備是否連接正常並已經加電(powered-up)。

  • DSR 有效時(ON)狀態,表明MODEM處於可以使用的狀態
  • DTR 有效時(ON)狀態,表明數據終端處於可以狀態

但是設備製造商實現了各個非標準的變體,比如用來進行流控^_^

windows

DCB 相關成員:

fDtrControl

DTR_CONTROL_DISABLE 保持off

DTR_CONTROL_ENABLE 保持on

DTR_CONTROL_HANDSHAKE 啓用硬件握手

fOutxDsrFlow

是否根據DSR的狀態確定數據收發

fDsrSensitivity

是否只接受DSR爲on時的數據

XON/XOFF

縮寫詞XOFF與 XON源於:transmit off 和 transmit on。x代表transmit/transmitter/....,前面遇到的 RxD,TxD也是這種情況。

ASCII碼值,十進制

名字

對應鍵盤按鍵

 

19

DC3(Device Control 1 )

CTRL+S

^S

17

DC1(Device Control 1 )

CTRL+Q

^Q

軟件流控使用這兩個字符,是一個事實標準。

注意:當使用這種流控方式時,兩個字符在帶內(in band)傳遞,所以我們將無法再直接傳輸這兩個字符,而只能自己根據需要進行轉義。

爲了健壯性,某些串口打印機每隔1~30秒發送一次 XON,以表明他們在線且準備好接受數據。

Windows

DCB結構中相關的成員:

fOutX

數據發送時是否使用軟件流控(收到XOFF停止發送數據,收到XON重新開始)

fInX

數據接收時是否使用軟件流控(當前緩衝區快滿時發送XOFF,有空間時發送XON)

fTXContinueOnXoff

接受緩衝區快滿而發送XOFF後,繼續發送發送緩衝區數據還是等待發送XON以後繼續

XonChar

設置我們前面提到的2個流控字符

XoffChar

參考


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章