|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術 | 電源技術 | 測控之家 | EMC技術 | ARM技術 | EDA技術 | PCB技術 | 嵌入式系統(tǒng) 驅動編程 | 集成電路 | 器件替換 | 模擬技術 | 新手園地 | 單 片 機 | DSP技術 | MCU技術 | IC 設計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
轉貼:Linux Serial Programming HOWTO - 串口通訊編程 |
| 作者:zlei 欄目:驅動編程 |
Linux Serial PROGRAMMING HOWTO - 串口通訊編程 http://www.fanqiang.com (2001-05-02 11:07:12) by Peter H. Baumann, Peter.Baumann@dlr.de 譯者: 曾元佑 yytseng@ms16.hinet.net V1.0, 22 一月 1998 -------------------------------------------------------------------------------- 本文件將敘述如何在 Linux 環(huán)境下撰寫序列埠的通訊程式. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 1. 簡介 本文是 Linux 序列埠程式撰寫的 HOWTO. 全篇都在討論如何在 Linux 環(huán)境下, 以序列埠與其他 裝置/電腦 通訊的程式寫法. 所解釋的技術包含: 標準的 I/O (只具備 傳送/接收 線的), 非同步 I/O, 及 等待來自多信號源的輸入訊號 的寫法. 本文不會敘述如何設定序列埠, 因為這在 Greg Hankins 的 Serial-HOWTO 已經(jīng)有說明了. 我必需強調我并非此領域中的專家, 而是在專案中曾遇到過這類的通訊問題. 在這所提到的□例程式是衍生自 miniterm 的程式碼. 可在 LDP 程式設計師指南取得 (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-guide/lpg-0.4.tar.gz 及其他映射站) 在□例那個目錄下. 我開始寫這份文件是在 1997 年 六月, 現(xiàn)在我已經(jīng)移轉到 WinNT 以滿足客戶的需求, 以致於我沒能學得更深入的知識. 如果任何人有什麼意見, 我很樂意把它擺進這份文件中 (參考 回饋 那一節(jié)). 如果有人能接手這份工作并加以改進, 請 e-mail 給我. 所有的□例都在 i386 Linux Kernel 2.0.29 下測試過. 1.1 版權 Linux Serial-PROGRAMMING-HOWTO 的版權(C) 1997 是 Peter Baumann 所有. Linux HOWTO 文件可以完整或部份以實際或電子型式重制或散布, 只要版權宣告能保留在所有散布的副本中. 商業(yè)性的重制散布是許可并被鼓勵的; 不過, 如果以此型式的散布 應該 告知作者. 所有有關的翻譯, 衍生的工作, 或整合合并任何 Linux HOWTO 文件皆必須在此版權宣告規(guī)□之下. 也就是, 你不可以自 HOWTO 所衍生的工作中, 散布的文件上附加額外的限制條款. 除了這些規(guī)則之外皆可在某種條件的授與; 請聯(lián)絡 Linux HOWTO 協(xié)調員: 如以下所給的位址. 簡而言之, 我們希望盡可能得透過各種管道促進這份資訊的流通, 不過, 我強烈的希望將版權宣告置於 HOWTO 的文件上, 任何 想 重新散布 HOWTO 的人, 均希望您能知會我們一下. 如果你有問題, 請經(jīng)由 email 與 Tim Bynum, Linux HOWTO 協(xié)調員連絡, linux-howto@sunsite.unc.edu. 1.2 本文最新的版本 Serial-PROGRAMMING-HOWTO 最新的版本將放在 ftp://sunsite.unc.edu:/pub/Linux/docs/HOWTO/Serial-PROGRAMMING-HOWTO 及其他映設站臺. 有許多的格式, 如 PostScript 及 DVI 的版本放在 other-formats 目錄下. Serial-PROGRAMMING-HOWTO 也放在 http://sunsite.unc.edu/LDP/HOWTO/Serial-PROGRAMMING-HOWTO.html 并會每個月擺一份到 comp.os.linux.answers. 1.3 回饋 請把任何修正, 問題, 意見, 建議, 或其它附加的題材傳送給我. 以讓我改進這份 HOWTO! 并詳細告訴我哪個部份是您不能了解, 或不夠清楚的. 你可以用 email 連絡我 Peter.Baumann@dlr.de. 請把 Serial-PROGRAMMING-HOWTO 的版本號碼附上, 本文版本號碼是 0.3. -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- 2. 開始 2.1 偵錯 最好的偵錯你程式碼的方法是建構另一臺 Linux box, 并把兩臺電腦用 null-modem 纜線連接. 用 miniterm (可在 LDP 程式設計師指南取得 (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-guide/lpg-0.4.tar.gz 在□例那個目錄下) 以傳送字元到你的 Linux box. Miniterm 很容易編譯而它會把所有輸入到鍵盤的字元透過序列埠傳送. 只有這個宣告定義會被檢查 #define MODEMDEVICE "/dev/ttyS0". 如果是 COM1 設定為 ttyS0, 如果是 COM2 設定為 ttyS1 等等.. 先前的測試是必要的, 所有的 字元都將以 raw 方式 (不經(jīng)任何處理) 直接傳送. 測試是否連接正確, 在兩臺電腦上都啟動 miniterm 然後隨便在鍵盤上亂按. 在其中一臺上輸入的字元應該會顯示在另一臺電腦上反之亦同. 但輸入的字元不會回應到與之相連的螢幕上. 要自制 null-modem 的電纜, 你必需要把 TxD (傳送) 及 RxD (接收) 兩線對調. 詳細的說明在 Serial-HOWTO 的第 7 段. 當然也可以只用一臺電腦來作相同的測試, 只要電腦上有兩個未使用的序列埠. 當然你也就要執(zhí)行兩個 miniterm 來當虛擬控制臺. 如果你是藉由拔去滑鼠來取得另一個序列埠, 記得要把 /dev/mouse 裝置重新導向, 如果它存在的話. 如果你使用多埠的序列埠控制卡, 請確定它已設定正確. 當我在我的電腦上測試時也曾經(jīng)因為設定錯誤而出過槌. 當我連到另一臺電腦, 通訊埠開始傳送字元. 就因為剛好這不是完整的非同步式傳輸, 所以可在同一臺電腦上執(zhí)行兩個程式. 2.2 連接埠設定 /dev/ttyS* 裝置會被當成連接到你的 Linux box 的終端機, 并且在啟動後就設定好了. 這個觀念在你寫 raw 裝置的通訊程式時必需記住. 也就是說這個連接埠被設定為回應所有自這個裝置送出的字元, 而用在資料傳輸時通常這種要改變這種工作模式. 所有的參數(shù)可以由一個小程式簡單的完成. 設定參數(shù)被放在一個結構體內 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 包含連接埠的設定, 如 鮑率, 每字元多少位元, 停止位元, 等等.. 區(qū)域模式旗標放在 c_lflag 用來偵測字元是否回應, 而訊號會送到你的程式, 等等.. 最後 c_cc 陣列定義了檔案終了的控制字元, 停止, 等等.. 預設的控制字元值放在 . 有關旗標的細節(jié)擺在使用手冊 termios(3). termios 結構體內的 c_LINE 行控制 (LINE discipLINE) 元素, 不能在 POSIX 相容的系統(tǒng)下使用譯者注:這里所說的 LINE discipLINE 雖然我翻成 行控制 但還是很難說出那是舍. 如果想知道請看看 kernel :( . 2.3 序列裝置的輸入觀念 有三個輸入的觀念要說明. 按照所要寫的應用程式選用適合的觀念. 盡量避免使用回圈來讀取單一的字元再組成字串. 我曾這樣做過, 會掉字元, 且對 read 而言不會顯示任何錯誤. 標準輸入程序 這是終端機的標準處理程序, 但用來與其他 dl 型式的以行為單位的輸入通訊也很有用, 也就是 read 會傳回一整行完整的輸入資料. 行預設的終止字元是 NL (ASCII LF), 檔案結束符, 或行終止字元. 預設環(huán)境下, CR (是 DOS/Windows 預設的行終止符) 不會終止一行的敘述. 標準的輸入處理程序還可以處理 清除, 刪除字, 重印字元, 及轉換 CR 為 NL 等等功能.. 在每一次困境中,我總是尋找成功的萌芽。 -------------------------------------------------------------------------------- 注冊: 2004-8 發(fā)帖: 920 積分: 1591 狀態(tài): onLINE 5 4 3 2 1 0 -1 -2 -3 -4 -5 1 lane 版主 來自: 發(fā)表于: 2004-9-17 22:35:16 -------------------------------------------------------------------------------- Re: 轉貼:Linux Serial PROGRAMMING HOWTO - 串口通訊編程 非標準輸入程序 非標準輸入程序可以用在需要每次讀取固定數(shù)量字元的情況, 并允許使用字元輸入時間的計時器. 這種模式可以用在讀取固定字元數(shù)量的應用程式, 或者所連接的裝置會突然送出大量字元的狀況. 非同步式輸入 以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式. 預設是在同步的模式下工作, 也就是在尚未讀取完之前, read 的狀態(tài)會被阻斷. 而非同步模式下 read 的狀態(tài)會直接返回并送出訊號到所叫用的程式直到完成工作. 這個訊號可以由訊號的處理程式 handler...來接收. 等待來自多個訊號來源的輸入 這并不是一個不一樣的輸入模式. 如果你要透過序列埠連接并處理多個裝置的話, 它是滿有用的. 在我的應用程式中我必需在幾乎同一時間內, 透過 TCP/IP SOCKET 及序列埠處理來自其他電腦的輸入訊號. 下面這個□例程式將等待來自兩個不同輸入源的訊號. 如果其中一個信號源出現(xiàn), 他就會被處理, 而程式會繼續(xù)等待新的輸入訊號. 以下這個方法看起來相當覆雜, 但請記住 Linux 是一個多工的作業(yè)系統(tǒng). SELECT 這個系統(tǒng)呼叫并不會在等待輸入訊號時把 CPU 負載加重, 而如果你用回圈方式來等待輸入訊號 |
|
|
| 免費注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點此進入 |
Copyright © 1998-2006 udpf.com.cn 浙ICP證030469號 |