Linux串口通信編程(Linux Serial Programming HOWTO)
發(fā)布時間:2008/8/18 0:00:00 訪問次數(shù):951
最好的偵錯你程式碼的方法是建構(gòu)另一臺 linux box, 并把兩臺電腦用 null-modem 纜線連接. 用 miniterm以傳送字元到你的 linux box. miniterm 很容易編譯而它會把所有輸入到鍵盤的字元透過序列埠傳送. 只有這個宣告定義會被檢查 #define modemdevice "/dev/ttys0". 如果是 com1 設(shè)定為 ttys0, 如果是 com2 設(shè)定為 ttys1 等等.. 先前的測試是必要的, 所有的 字元都將以 raw 方式 (不經(jīng)任何處理) 直接傳送. 測試是否連接正確, 在兩臺電腦上都啟動 miniterm 然後隨便在鍵盤上亂按. 在其中一臺上輸入的字元應(yīng)該會顯示在另一臺電腦上反之亦同. 但輸入的字元不會回應(yīng)到與之相連的螢?zāi)簧?
要自制 null-modem 的電纜, 你必需要把 txd (傳送) 及 rxd (接收) 兩線對調(diào).
當然也可以只用一臺電腦來作相同的測試, 只要電腦上有兩個未使用的序列埠. 當然你也就要執(zhí)行兩個 miniterm 來當虛擬控制臺. 如果你是藉由拔去滑鼠來取得另一個序列埠, 記得要把 /dev/mouse 裝置重新導(dǎo)向, 如果它存在的話. 如果你使用多埠的序列埠控制卡, 請確定它已設(shè)定正確. 當我在我的電腦上測試時也曾經(jīng)因為設(shè)定錯誤而出過槌. 當我連到另一臺電腦, 通訊埠開始傳送字元. 就因為剛好這不是完整的非同步式傳輸, 所以可在同一臺電腦上執(zhí)行兩個程式.
連接埠設(shè)定
/dev/ttys* 裝置會被當成連接到你的 linux box 的終端機, 并且在啟動後就設(shè)定好了. 這個觀念在你寫 raw 裝置的通訊程式時必需記住. 也就是說這個連接埠被設(shè)定為回應(yīng)所有自這個裝置送出的字元, 而用在資料傳輸時通常這種要改變這種工作模式.
所有的參數(shù)可以由一個小程式簡單的完成. 設(shè)定參數(shù)被放在一個結(jié)構(gòu)體內(nèi) struct termios, 他的定義檔在 :
#define nccs 19
struct termios {
tcflag_t c_iflag; /* 輸入模式旗標 */
tcflag_t c_oflag; /* 輸出模式旗標 */
tcflag_t c_cflag; /* 控制模式旗標 */
tcflag_t c_lflag; /* 區(qū)域模式旗標 */
cc_t c_line; /* 行控制 (line discipline) */
cc_t c_cc[nccs]; /* 控制特性 */
};
這個檔案也包含所有的旗標定義. 輸入模式旗標在 c_iflag 掌管所有的輸入處理, 這就意謂著由裝置上傳來的字元在還沒用 read 功能讀取前可以先處理過. 同理 c_oflag 掌管所有的輸出處理. c_cflag 包含連接埠的設(shè)定, 如 鮑率, 每字元多少位元, 停止位元, 等等.. 區(qū)域模式旗標放在 c_lflag 用來偵測字元是否回應(yīng), 而訊號會送到你的程式, 等等.. 最後 c_cc 陣列定義了檔案終了的控制字元, 停止, 等等.. 預(yù)設(shè)的控制字元值放在 . 有關(guān)旗標的細節(jié)擺在使用手冊 termios(3). termios 結(jié)構(gòu)體內(nèi)的 c_line 行控制 (line discipline) 元素, 不能在 posix 相容的系統(tǒng)下使用譯者注:這里所說的 line discipline 雖然我翻成 行控制但還是很難說出那是舍. 如果想知道請看看 kernel :( .
序列裝置的輸入觀念
有三個輸入的觀念要說明. 按照所要寫的應(yīng)用程式選用適合的觀念. 盡量避免使用回圈來讀取單一的字元再組成字串. 我曾這樣做過, 會掉字元, 且對 read 而言不會顯示任何錯誤.
標準輸入程序
這是終端機的標準處理程序, 但用來與其他 dl 型式的以行為單位的輸入通訊也很有用, 也就是 read 會傳回一整行完整的輸入資料. 行預(yù)設(shè)的終止字元是 nl (ascii lf), 檔案結(jié)束符, 或行終止字元. 預(yù)設(shè)環(huán)境下, cr (是 dos/windows 預(yù)設(shè)的行終止符) 不會終止一行的敘述.
標準的輸入處理程序還可以處理 清除, 刪除字, 重印字元, 及轉(zhuǎn)換 cr 為 nl 等等功能..
非標準輸入程序
非標準輸入程序可以用在需要每次讀取固定數(shù)量字元的情況, 并允許使用字元輸入時間的計時器. 這種模式可以用在讀取固定字元數(shù)量的應(yīng)用程式, 或者所連接的裝置會突然送出大量字元的狀況.
非同步式輸入
以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式. 預(yù)設(shè)是在同步的模式下工作, 也就是在尚未讀取完之前, read 的狀態(tài)會被阻斷. 而非同步模式下 read 的狀態(tài)會直接返回并送出訊號到所叫用的程式直到完成工作. 這個訊號可以由訊號的處理程式 handler...來接收.
等待來自多個訊號來源的輸入
這并不是一個
最好的偵錯你程式碼的方法是建構(gòu)另一臺 linux box, 并把兩臺電腦用 null-modem 纜線連接. 用 miniterm以傳送字元到你的 linux box. miniterm 很容易編譯而它會把所有輸入到鍵盤的字元透過序列埠傳送. 只有這個宣告定義會被檢查 #define modemdevice "/dev/ttys0". 如果是 com1 設(shè)定為 ttys0, 如果是 com2 設(shè)定為 ttys1 等等.. 先前的測試是必要的, 所有的 字元都將以 raw 方式 (不經(jīng)任何處理) 直接傳送. 測試是否連接正確, 在兩臺電腦上都啟動 miniterm 然後隨便在鍵盤上亂按. 在其中一臺上輸入的字元應(yīng)該會顯示在另一臺電腦上反之亦同. 但輸入的字元不會回應(yīng)到與之相連的螢?zāi)簧?
要自制 null-modem 的電纜, 你必需要把 txd (傳送) 及 rxd (接收) 兩線對調(diào).
當然也可以只用一臺電腦來作相同的測試, 只要電腦上有兩個未使用的序列埠. 當然你也就要執(zhí)行兩個 miniterm 來當虛擬控制臺. 如果你是藉由拔去滑鼠來取得另一個序列埠, 記得要把 /dev/mouse 裝置重新導(dǎo)向, 如果它存在的話. 如果你使用多埠的序列埠控制卡, 請確定它已設(shè)定正確. 當我在我的電腦上測試時也曾經(jīng)因為設(shè)定錯誤而出過槌. 當我連到另一臺電腦, 通訊埠開始傳送字元. 就因為剛好這不是完整的非同步式傳輸, 所以可在同一臺電腦上執(zhí)行兩個程式.
連接埠設(shè)定
/dev/ttys* 裝置會被當成連接到你的 linux box 的終端機, 并且在啟動後就設(shè)定好了. 這個觀念在你寫 raw 裝置的通訊程式時必需記住. 也就是說這個連接埠被設(shè)定為回應(yīng)所有自這個裝置送出的字元, 而用在資料傳輸時通常這種要改變這種工作模式.
所有的參數(shù)可以由一個小程式簡單的完成. 設(shè)定參數(shù)被放在一個結(jié)構(gòu)體內(nèi) struct termios, 他的定義檔在 :
#define nccs 19
struct termios {
tcflag_t c_iflag; /* 輸入模式旗標 */
tcflag_t c_oflag; /* 輸出模式旗標 */
tcflag_t c_cflag; /* 控制模式旗標 */
tcflag_t c_lflag; /* 區(qū)域模式旗標 */
cc_t c_line; /* 行控制 (line discipline) */
cc_t c_cc[nccs]; /* 控制特性 */
};
這個檔案也包含所有的旗標定義. 輸入模式旗標在 c_iflag 掌管所有的輸入處理, 這就意謂著由裝置上傳來的字元在還沒用 read 功能讀取前可以先處理過. 同理 c_oflag 掌管所有的輸出處理. c_cflag 包含連接埠的設(shè)定, 如 鮑率, 每字元多少位元, 停止位元, 等等.. 區(qū)域模式旗標放在 c_lflag 用來偵測字元是否回應(yīng), 而訊號會送到你的程式, 等等.. 最後 c_cc 陣列定義了檔案終了的控制字元, 停止, 等等.. 預(yù)設(shè)的控制字元值放在 . 有關(guān)旗標的細節(jié)擺在使用手冊 termios(3). termios 結(jié)構(gòu)體內(nèi)的 c_line 行控制 (line discipline) 元素, 不能在 posix 相容的系統(tǒng)下使用譯者注:這里所說的 line discipline 雖然我翻成 行控制但還是很難說出那是舍. 如果想知道請看看 kernel :( .
序列裝置的輸入觀念
有三個輸入的觀念要說明. 按照所要寫的應(yīng)用程式選用適合的觀念. 盡量避免使用回圈來讀取單一的字元再組成字串. 我曾這樣做過, 會掉字元, 且對 read 而言不會顯示任何錯誤.
標準輸入程序
這是終端機的標準處理程序, 但用來與其他 dl 型式的以行為單位的輸入通訊也很有用, 也就是 read 會傳回一整行完整的輸入資料. 行預(yù)設(shè)的終止字元是 nl (ascii lf), 檔案結(jié)束符, 或行終止字元. 預(yù)設(shè)環(huán)境下, cr (是 dos/windows 預(yù)設(shè)的行終止符) 不會終止一行的敘述.
標準的輸入處理程序還可以處理 清除, 刪除字, 重印字元, 及轉(zhuǎn)換 cr 為 nl 等等功能..
非標準輸入程序
非標準輸入程序可以用在需要每次讀取固定數(shù)量字元的情況, 并允許使用字元輸入時間的計時器. 這種模式可以用在讀取固定字元數(shù)量的應(yīng)用程式, 或者所連接的裝置會突然送出大量字元的狀況.
非同步式輸入
以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式. 預(yù)設(shè)是在同步的模式下工作, 也就是在尚未讀取完之前, read 的狀態(tài)會被阻斷. 而非同步模式下 read 的狀態(tài)會直接返回并送出訊號到所叫用的程式直到完成工作. 這個訊號可以由訊號的處理程式 handler...來接收.
等待來自多個訊號來源的輸入
這并不是一個
熱門點擊
- 2G/3G RAN承載網(wǎng)解決方案
- GPRS DT/CQT測試中異常問題分析
- Semtech推出集成IEEE1588 PT
- Linux串口通信編程(Linux Seri
- 采用開放式芯片協(xié)議(OCP)總線的跟蹤儀器與
- Fulcrum推出10-Gigabit以太網(wǎng)
- H.248協(xié)議在通信網(wǎng)絡(luò)中的應(yīng)用
- SiGe半導(dǎo)體推出SE4150L超小雙天線輸
- LitePoint解密多種無線通訊標準的測試
- 輕量級TCP/IP協(xié)議棧OpenTCP的移植
推薦技術(shù)資料
- MOSFET 電感單片降壓開關(guān)模式變換器優(yōu)勢
- SiC MOSFET 和 IG
- 新型 電隔離無芯線性霍爾效應(yīng)電
- 業(yè)界超小絕對位置編碼器技術(shù)參數(shù)設(shè)計
- 高帶寬、更高分辨率磁角度傳感技術(shù)應(yīng)用探究
- MagAlpha 角度位置傳感
- 多媒體協(xié)處理器SM501在嵌入式系統(tǒng)中的應(yīng)用
- 基于IEEE802.11b的EPA溫度變送器
- QUICCEngine新引擎推動IP網(wǎng)絡(luò)革新
- SoC面世八年后的產(chǎn)業(yè)機遇
- MPC8xx系列處理器的嵌入式系統(tǒng)電源設(shè)計
- dsPIC及其在交流變頻調(diào)速中的應(yīng)用研究