POSIX 串口编程指南
生活随笔
收集整理的這篇文章主要介紹了
POSIX 串口编程指南
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
介紹
POSIX 串口編程指南將教會你在你的 UNIX 工作站或者 PC 上面如何成功、有效以及可移植性的對串口編程。每一章提供了使用 POSIX 終端控制函數(shù)的編程例程,可以基本不經(jīng)修改地工作在?IRIX?, HP-UX, SunOS?, Solaris?, Digital UNIX?, Linux? 以及其他大多數(shù) UNIX 操作系統(tǒng)。你會發(fā)現(xiàn)操作系統(tǒng)之間的最大差異是串口設(shè)備文件名和鎖文件。 原文鏈接:Serial Programming Guide for POSIX Operating Systems 本指南分為以下章節(jié)和附錄:
- 第一章 串口通信基礎(chǔ)
- 第二章 串口配置
- 第三章 MODEM 通信
- 第四章 高級串口編程
- 附錄A 引腳分布
- 附錄B ASCII 碼
第一章 串口通信基礎(chǔ)
本章介紹了串口通信,RS-232 和 大多數(shù)計算機上使用的其他標準,以及如何通過 C 程序操作串口。
什么是串口通信
計算機一次傳輸信息(數(shù)據(jù))一位或多個比特位。串行是指傳輸數(shù)據(jù)一次只傳輸一位。當進行串口通信時你發(fā)送或者接收的每個字(即字節(jié)或字符)一次發(fā)送一位。每一位都是 on 或者 off。術(shù)語用mark代表 on,用 space代表 off。 串口數(shù)據(jù)速率使用 bits-per-second ("bps") 或者 baudot rate ("baud")。這表示一秒內(nèi)可以傳輸多少邏輯 1 和 0。當波特率超過 1000,你會經(jīng)常看到用 kilo baud 表示的速率。對于超過 1000000 的速率用 megabaud,或者 Mbps 來表示。 當涉及到串口設(shè)備或者端口,它們被標識為“數(shù)據(jù)通訊設(shè)備”("DCE")或者“數(shù)據(jù)終端設(shè)備”("DTE")。兩者之間的區(qū)別很簡單 - 每個信號對,如發(fā)送和接收,是交叉的。
什么是 RS-232
RS-232 是由 EIA 定義的用于串口通信的標準電氣接口。RS-232 實際上有三種不同的類型(A,B和C),每一種對于 on 和 off 電平定義了不同的電壓范圍。最常用的種類是 RS-232C,它定義mark位電壓范圍:-3V~-12V 和space位電壓范圍:+3V~+12V。RS-232C 規(guī)范上說,這些信號可以傳輸 25英尺(8m),通常你可以傳輸更遠一些只要波特率足夠低。 除了數(shù)據(jù)輸入和輸出數(shù)據(jù)線,還有其他提供時序、狀態(tài)與握手的信號線。這里我們僅列舉最為常見的 DB-9 接口分布圖,引腳和功能描述如下所示:
- 1 -?DCD?- 數(shù)據(jù)載波檢測
- 2 -?RXD?- 接收數(shù)據(jù)
- 3 -?TXD?- 發(fā)送數(shù)據(jù)
- 4 -?DTR?- 數(shù)據(jù)終端就緒
- 5 -?GND?- 地
- 6 -?DSR?- 數(shù)據(jù)裝置就緒
- 7 -?RTS?- 請求發(fā)送
- 8 -?CTS?- 清除發(fā)送
- 9 -?RI?- 振鈴指示
信號定義
RS-232 標準針對串口通信定義了18種不同的信號。其中,在 UNIX 環(huán)境下通常只有 6 種可用。
GND - 邏輯地 從技術(shù)上講,邏輯接地不是信號,但沒有它,其他信號就不能工作。從根本上說,邏輯地充當一個參考電壓,從而知道哪些電壓為正或負。
TXD - 發(fā)送數(shù)據(jù) mark 電平為邏輯 1,space 電平為邏輯 0。注意 RS232 電平與 TTL 電平反相。
RXD - 接收數(shù)據(jù) 同樣的,mark 電平為邏輯 1,space 電平為邏輯 0。注意 RS232 電平與 TTL 電平反相。
DCD - 數(shù)據(jù)載波檢測 DCD 信號接收自串口線纜的另一端的計算機或設(shè)備。信號線低電平表示計算機或設(shè)備當前已連接或在線。DCD 不經(jīng)常使用。
DTR - 數(shù)據(jù)終端就緒 DTR 信號用于通知對端計算機或設(shè)備己方已就緒(space 電平)或未就緒(mark 電平)。DTR 通常在打開串口時自動使能。
CTS - 清除發(fā)送 CTS 信號接收自串口線纜的另一端。信號線 space?電平表示可以己方可以發(fā)送數(shù)據(jù)。CTS 通常用于串口數(shù)據(jù)流控。
RTS - 請求發(fā)送 RTS 設(shè)置為 space 電平表示己方準備好就接收數(shù)據(jù)。一般與 CTS 一起用于串口流控,通常被設(shè)置為默認有效狀態(tài)。
異步通信
解析串口數(shù)據(jù)需要確定一個字符的結(jié)束與下一個字符的開始。本章專門講述異步串口數(shù)據(jù)。 在異步模式下串口數(shù)據(jù)線保持在 mark 狀態(tài)(邏輯 '1')直到有字符發(fā)送,也即串口的空閑態(tài)是 mark 態(tài)。每個字節(jié)起始位在前,字節(jié)的每一位緊隨其后,一位可選校驗位以及一位或者兩位停止位。起始位始終是 space 電平(邏輯'0'),通知對方有新串口數(shù)據(jù)可用。數(shù)據(jù)可以同時發(fā)送和接收,因此稱為“異步”。
可選校驗位是數(shù)據(jù)位的簡單累加和,指示數(shù)據(jù)是否包含奇數(shù)或者偶數(shù)個 1。偶校驗時,如果一個字符中有偶數(shù)個 1 那么校驗位是 0。奇校驗時,如果一個字符中有奇數(shù)個 1 那么校驗位是 0。除此之外,你還可能聽過術(shù)語 space 校驗,mark 校驗以及無校驗。Space 校驗指示校驗位永遠是 0,而 mark 校驗是指校驗位一直為 1。無校驗意味著沒有校驗位存在或被傳輸。 剩下的位稱作停止位。在字符之間可能會有 1,1.5 或者 2 位停止位并且這些位總為 1。停止位過去用于騰出時間為硬件處理之前的數(shù)據(jù),但現(xiàn)在只用于接收字符與硬件設(shè)備的同步。異步數(shù)據(jù)格式通常表達成“8N1”,“7E1”等。
什么是全雙工和半雙工
全雙工是指設(shè)備可以同時發(fā)送和接收數(shù)據(jù) - 有兩個獨立數(shù)據(jù)通道(一路輸入,一路輸出)。 半雙工是指設(shè)備不能同時發(fā)送和接收數(shù)據(jù)。這通常意味著只有一路可以通訊。這并不代表有任何的 RS-232 信號未被使用,相反,這通常意味著使用的一些非 RS-232 標準的通訊鏈路不支持全雙工操作。
流控
在兩個串口設(shè)備間傳輸數(shù)據(jù)時經(jīng)常有必要進行數(shù)據(jù)流控。這可能是受到中間串口通信線路、其中一個設(shè)備或者其他存儲介質(zhì)的限制。異步數(shù)據(jù)流控通常使用的有兩種方法。 第一種方法通常稱為“軟件”流控,使用特殊字符開始(XON or DC1)或者停止(XOFF or DC3)數(shù)據(jù)流。這些字符定義參見 ASCII 碼表。這些碼值在傳輸文本信息時很有用,但不能在未經(jīng)特殊編程時用于傳輸其他類型的信息。 第二種方法稱作“硬件”流控,使用 CTS 和 RTS 信號線取代特殊字符。當接收方準備好接收數(shù)據(jù)時會將 RTS 置為 space 電壓以請求對方發(fā)送數(shù)據(jù),當未準備好時置為 mark 電壓,因此發(fā)送方會通過檢測 CTS 電平狀態(tài)判斷是否可以發(fā)送數(shù)據(jù)。由于硬件流控使用獨立的信號集合,因此比軟件流控速度要快。
Break信號
通常情況下收發(fā)數(shù)據(jù)信號線保持在 mark 電平狀態(tài)直到傳輸一個新字節(jié)。如果信號拉低至 space 電壓一段時間,通常是 1/4 到 1/2 秒,那么就說一個 break 條件滿足。一個 break 信號有時用于復(fù)位通訊或者改變通訊硬件的操作模式,如 MODEM。
同步通信
不同于異步數(shù)據(jù),同步數(shù)據(jù)以恒定比特流顯示。為了讀取數(shù)據(jù),通訊方必須提供或接收一通用位作為時鐘使發(fā)送和接收者同步。 盡管有時鐘同步,通訊方也必須以某種方式標記數(shù)據(jù)開始。實現(xiàn)的最常用方法是使用像“串行數(shù)據(jù)鏈路控制”(“SDLC”)或者“高速數(shù)據(jù)鏈路控制”(“HDLC”)的數(shù)據(jù)包協(xié)議。 每種協(xié)議定義了一定的位序列來表示數(shù)據(jù)包的開始和結(jié)束,也定義了沒有數(shù)據(jù)時的位序列。這些位序列使得通訊方明確數(shù)據(jù)包的開始。由于同步協(xié)議不使用每字節(jié)同步位它們比異步通信有至少25%的性能提升并且在多余兩個串口的情形下更適合于遠程網(wǎng)絡(luò)和配置。 盡管同步通信有速度優(yōu)勢,由于需要額外的軟硬件大多數(shù) RS-232 硬件不支持。
編程指南的其他章節(jié)內(nèi)容我先前翻譯過,但是由于內(nèi)容和部分知識點較為陳舊,因此我用其他整錄的博客系列 -《Linux 串口編程》中進行詳細講解,感興趣的可以移步至:
總結(jié)
以上是生活随笔為你收集整理的POSIX 串口编程指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA进阶day05包和权限
- 下一篇: Quartus II下进行SignalT