亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? linux serial programming howto - 串口通訊編程.txt

?? 學習(編程技巧_編程知識_程序代碼),是學習編程不可多得的學習精驗
?? TXT
?? 第 1 頁 / 共 2 頁
字號:
Linux Serial Programming HOWTO - 串口通訊編程
 

--------------------------------------------------------------------------------
 
第八軍團 時間:2004-1-17 21:59:43 
   
1. 簡介 
本文是 Linux 序列埠程式撰寫的 HOWTO. 全篇都在討論如何在 Linux 環境下, 以序列埠與其他 裝置/電腦 通訊的程式寫法. 所解釋的技術包含: 標準的 I/O (只具備 傳送/接收 線的), 非同步 I/O, 及 等待來自多信號源的輸入訊號 的寫法.  

本文不會敘述如何設定序列埠, 因為這在 Greg Hankins 的 Serial-HOWTO 已經有說明了.  

我必需強調我并非此領域中的專家, 而是在專案中曾遇到過這類的通訊問題. 在這所提到的□例程式是衍生自 miniterm 的程式碼. 可在 LDP 程式設計師指南取得 (ftp://sunsite.unc.edu/pub/Linux/docs/LDP/programmers-guide/lpg-0.4.tar.gz 及其他映射站) 在□例那個目錄下.  

我開始寫這份文件是在 1997 年 六月, 現在我已經移轉到 WinNT 以滿足客戶的需求, 以致於我沒能學得更深入的知識. 如果任何人有什麼意見, 我很樂意把它擺進這份文件中 (參考 回饋 那一節). 如果有人能接手這份工作并加以改進, 請 e-mail 給我.  

所有的□例都在 i386 Linux Kernel 2.0.29 下測試過.  


1.1 版權  
Linux Serial-Programming-HOWTO 的版權(C) 1997 是 Peter Baumann 所有. Linux HOWTO 文件可以完整或部份以實際或電子型式重制或散布, 只要版權宣告能保留在所有散布的副本中. 商業性的重制散布是許可并被鼓勵的; 不過, 如果以此型式的散布 應該 告知作者.  

所有有關的翻譯, 衍生的工作, 或整合合并任何 Linux HOWTO 文件皆必須在此版權宣告規□之下. 也就是, 你不可以自 HOWTO 所衍生的工作中, 散布的文件上附加額外的限制條款. 除了這些規則之外皆可在某種條件的授與; 請聯絡 Linux HOWTO 協調員: 如以下所給的位址.  

簡而言之, 我們希望盡可能得透過各種管道促進這份資訊的流通, 不過, 我強烈的希望將版權宣告置於 HOWTO 的文件上, 任何 想 重新散布 HOWTO 的人, 均希望您能知會我們一下.  

如果你有問題, 請經由 email 與 Tim Bynum, Linux HOWTO 協調員連絡, 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 方式 (不經任何處理) 直接傳送. 測試是否連接正確, 在兩臺電腦上都啟動 miniterm 然後隨便在鍵盤上亂按. 在其中一臺上輸入的字元應該會顯示在另一臺電腦上反之亦同. 但輸入的字元不會回應到與之相連的螢幕上.  

要自制 null-modem 的電纜, 你必需要把 TxD (傳送) 及 RxD (接收) 兩線對調. 詳細的說明在 Serial-HOWTO 的第 7 段.  

當然也可以只用一臺電腦來作相同的測試, 只要電腦上有兩個未使用的序列埠. 當然你也就要執行兩個 miniterm 來當虛擬控制臺. 如果你是藉由拔去滑鼠來取得另一個序列埠, 記得要把 /dev/mouse 裝置重新導向, 如果它存在的話. 如果你使用多埠的序列埠控制卡, 請確定它已設定正確. 當我在我的電腦上測試時也曾經因為設定錯誤而出過槌. 當我連到另一臺電腦, 通訊埠開始傳送字元. 就因為剛好這不是完整的非同步式傳輸, 所以可在同一臺電腦上執行兩個程式.  


2.2 連接埠設定  
/dev/ttyS* 裝置會被當成連接到你的 Linux box 的終端機, 并且在啟動後就設定好了. 這個觀念在你寫 raw 裝置的通訊程式時必需記住. 也就是說這個連接埠被設定為回應所有自這個裝置送出的字元, 而用在資料傳輸時通常這種要改變這種工作模式.  

所有的參數可以由一個小程式簡單的完成. 設定參數被放在一個結構體內 struct termios, 他的定義檔在 :  

#define NCCS 19 
struct termios { 
        tcflag_t c_iflag;               /* 輸入模式旗標 */ 
        tcflag_t c_oflag;               /* 輸出模式旗標 */ 
        tcflag_t c_cflag;               /* 控制模式旗標 */ 
        tcflag_t c_lflag;               /* 區域模式旗標 */ 
        cc_t c_line;                    /* 行控制 (line discipline) */ 
        cc_t c_cc[NCCS];                /* 控制特性 */ 
}; 

這個檔案也包含所有的旗標定義. 輸入模式旗標在 c_iflag 掌管所有的輸入處理, 這就意謂著由裝置上傳來的字元在還沒用 read 功能讀取前可以先處理過. 同理 c_oflag 掌管所有的輸出處理. c_cflag 包含連接埠的設定, 如 鮑率, 每字元多少位元, 停止位元, 等等.. 區域模式旗標放在 c_lflag 用來偵測字元是否回應, 而訊號會送到你的程式, 等等.. 最後 c_cc 陣列定義了檔案終了的控制字元, 停止, 等等.. 預設的控制字元值放在 . 有關旗標的細節擺在使用手冊 termios(3). termios 結構體內的 c_line 行控制 (line discipline) 元素, 不能在 POSIX 相容的系統下使用譯者注:這里所說的 line discipline 雖然我翻成 行控制 但還是很難說出那是舍. 如果想知道請看看 kernel :( .  



2.3 序列裝置的輸入觀念  
有三個輸入的觀念要說明. 按照所要寫的應用程式選用適合的觀念. 盡量避免使用回圈來讀取單一的字元再組成字串. 我曾這樣做過, 會掉字元, 且對 read 而言不會顯示任何錯誤.  


標準輸入程序 
這是終端機的標準處理程序, 但用來與其他 dl 型式的以行為單位的輸入通訊也很有用, 也就是 read 會傳回一整行完整的輸入資料. 行預設的終止字元是 NL (ASCII LF), 檔案結束符, 或行終止字元. 預設環境下, CR (是 DOS/Windows 預設的行終止符) 不會終止一行的敘述.  

標準的輸入處理程序還可以處理 清除, 刪除字, 重印字元, 及轉換 CR 為 NL 等等功能..  


非標準輸入程序 
非標準輸入程序可以用在需要每次讀取固定數量字元的情況, 并允許使用字元輸入時間的計時器. 這種模式可以用在讀取固定字元數量的應用程式, 或者所連接的裝置會突然送出大量字元的狀況.  



非同步式輸入 
以上所敘述的兩種模式都可以用在非同步與同步的傳輸模式. 預設是在同步的模式下工作, 也就是在尚未讀取完之前, read 的狀態會被阻斷. 而非同步模式下 read 的狀態會直接返回并送出訊號到所叫用的程式直到完成工作. 這個訊號可以由訊號的處理程式 handler...來接收.  


等待來自多個訊號來源的輸入 
這并不是一個不一樣的輸入模式. 如果你要透過序列埠連接并處理多個裝置的話, 它是滿有用的. 在我的應用程式中我必需在幾乎同一時間內, 透過 TCP/IP socket 及序列埠處理來自其他電腦的輸入訊號. 下面這個□例程式將等待來自兩個不同輸入源的訊號. 如果其中一個信號源出現, 他就會被處理, 而程式會繼續等待新的輸入訊號.  

以下這個方法看起來相當覆雜, 但請記住 Linux 是一個多工的作業系統. select 這個系統呼叫并不會在等待輸入訊號時把 CPU 負載加重, 而如果你用回圈方式來等待輸入訊號將使得其它同時執行的行程被拖慢.  




-------------------------------------------------------------------------------- 
    
-------------------------------------------------------------------------------- 

3. 程式□例 
所有的□例來源自 miniterm.c. The type ahead 暫存器被限制在 255 個字元, 就跟標準輸入程序的最大字串長度相同 ( 或 ).  

參考程式碼中的注解它會解釋不同輸入模式的使用. 我希望這些程式碼都能被了解. 標準輸入程序的程式□例的注解寫得最好, 其它的□例都只在不同於其它□例的地方做注解.  

敘述不是很完整, 但可以激勵你對這□例做實驗, 以延生出合於你所需應用程式的最佳解.  

別忘記要把序列埠的權限設定正確 (也就是: chmod a+rw /dev/ttyS1)!  



3.1 標準輸入程序  

#include  
#include  
#include  
#include  
#include  

/* 鮑率設定被定義在 , 這在  被引入 */ 
#define BAUDRATE B38400             
/* 定義正確的序列埠 */ 
#define MODEMDEVICE "/dev/ttyS1" 
#define _POSIX_SOURCE 1 /* POSIX 系統相容 */ 

#define FALSE 0 
#define TRUE 1 

volatile int STOP=FALSE;  

main() 
{ 
  int fd,c, res; 
  struct termios oldtio,newtio; 
  char buf[255]; 
/*  
  開啟數據機裝置以讀取并寫入而不以控制 tty 的模式 
  因為我們不想程式在送出 CTRL-C 後就被殺掉. 
*/ 
 fd = open(MODEMDEVICE, O_RDWR | O_NOCTTY );  
 if (fd <0) {perror(MODEMDEVICE); exit(-1); } 

 tcgetattr(fd,&oldtio); /* 儲存目前的序列埠設定 */ 
 bzero(&newtio, sizeof(newtio)); /* 清除結構體以放入新的序列埠設定值 */ 

/*  
  BAUDRATE: 設定 bps 的速度. 你也可以用 cfsetispeed 及 cfsetospeed 來設定. 
  CRTSCTS : 輸出資料的硬體流量控制 (只能在具完整線路的纜線下工作 
            參考 Serial-HOWTO 第七節) 
  CS8     : 8n1 (8 位元, 不做同位元檢查,1 個終止位元) 
  CLOCAL  : 本地連線, 不具數據機控制功能 
  CREAD   : 致能接收字元 
*/ 
 newtio.c_cflag = BAUDRATE | CRTSCTS | CS8 | CLOCAL | CREAD; 
  
/* 
  IGNPAR  : 忽略經同位元檢查後, 錯誤的位元組 
  ICRNL   : 比 CR 對應成 NL (否則當輸入訊號有 CR 時不會終止輸入) 
            在不然把裝置設定成 raw 模式(沒有其它的輸入處理) 
*/ 
 newtio.c_iflag = IGNPAR | ICRNL; 
  
/* 
 Raw 模式輸出. 
*/ 
 newtio.c_oflag = 0; 
  
/* 
  ICANON  : 致能標準輸入, 使所有回應機能停用, 并不送出信號以叫用程式 
*/ 
 newtio.c_lflag = ICANON; 
  
/*  
  初始化所有的控制特性 
  預設值可以在 /usr/include/termios.h 找到, 在注解中也有, 
  但我們在這不需要看它們 
*/ 
 newtio.c_cc[VINTR]    = 0;     /* Ctrl-c */  
 newtio.c_cc[VQUIT]    = 0;     /* Ctrl-\ */ 
 newtio.c_cc[VERASE]   = 0;     /* del */ 
 newtio.c_cc[VKILL]    = 0;     /* @ */ 
 newtio.c_cc[VEOF]     = 4;     /* Ctrl-d */ 
 newtio.c_cc[VTIME]    = 0;     /* 不使用分割字元組的計時器 */ 
 newtio.c_cc[VMIN]     = 1;     /* 在讀取到 1 個字元前先停止 */ 
 newtio.c_cc[VSWTC]    = 0;     /* '\0' */ 
 newtio.c_cc[VSTART]   = 0;     /* Ctrl-q */  
 newtio.c_cc[VSTOP]    = 0;     /* Ctrl-s */ 
 newtio.c_cc[VSUSP]    = 0;     /* Ctrl-z */ 
 newtio.c_cc[VEOL]     = 0;     /* '\0' */ 
 newtio.c_cc[VREPRINT] = 0;     /* Ctrl-r */ 
 newtio.c_cc[VDISCARD] = 0;     /* Ctrl-u */ 
 newtio.c_cc[VWERASE]  = 0;     /* Ctrl-w */ 
 newtio.c_cc[VLNEXT]   = 0;     /* Ctrl-v */ 
 newtio.c_cc[VEOL2]    = 0;     /* '\0' */ 

/*  
  現在清除數據機線并啟動序列埠的設定 
*/ 
 tcflush(fd, TCIFLUSH); 
 tcsetattr(fd,TCSANOW,&newtio); 

/* 
  終端機設定完成, 現在處理輸入訊號 
  在這個□例, 在一行的開始處輸入 'z' 會退出此程式. 
*/ 
 while (STOP==FALSE) {     /* 回圈會在我們發出終止的訊號後跳出 */ 
 /* 即使輸入超過 255 個字元, 讀取的程式段還是會一直等到行終結符出現才停止. 
    如果讀到的字元組低於正確存在的字元組, 則所剩的字元會在下一次讀取時取得. 
    res 用來存放真正讀到的字元組個數 */ 
    res = read(fd,buf,255);  
    buf[res]=0;             /* 設定字串終止字元, 所以我們能用 printf */ 
    printf(":%s:%d\n", buf, res); 
    if (buf[0]=='z') STOP=TRUE; 
 } 
 /* 回存舊的序列埠設定值 */ 
 tcsetattr(fd,TCSANOW,&oldtio); 
} 



3.2 非標準輸入程序  
在非標準的輸入程序模式下, 輸入的資料不會被組合成一行而輸入後的處理功能 (清除, 殺掉, 刪除, 等等.) 都不能使用. 這個模式有兩個功能控制參數: c_cc[VTIME] 設定字元輸入時間計時器, 及 c_cc[VMIN] 設定滿足讀取功能的最低字元接收個數.  

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲一级二级三级| 精品国精品自拍自在线| 国产xxx精品视频大全| 琪琪久久久久日韩精品| 香蕉加勒比综合久久| 亚洲成人动漫精品| 五月激情综合婷婷| 热久久久久久久| 毛片av一区二区三区| 极品少妇xxxx偷拍精品少妇| 久久超级碰视频| 国产一区二区三区四| 国产成人亚洲综合色影视| 成人小视频在线观看| 99久久精品免费| 在线观看一区不卡| 69精品人人人人| 久久亚洲二区三区| 欧美韩日一区二区三区四区| 亚洲国产精品国自产拍av| 亚洲欧美日韩人成在线播放| 亚洲大型综合色站| 久久成人18免费观看| 国产a视频精品免费观看| 一本大道久久a久久综合| 欧美日韩国产高清一区| 久久综合色8888| 亚洲青青青在线视频| 日本色综合中文字幕| 国产成人丝袜美腿| 欧美在线观看18| 欧美成人激情免费网| 国产精品美女久久福利网站| 亚洲成人自拍一区| 国产成人综合网| 7777女厕盗摄久久久| 国产精品国产三级国产a| 亚洲bdsm女犯bdsm网站| 国产高清无密码一区二区三区| 6080日韩午夜伦伦午夜伦| 欧美国产日本视频| 日韩精品国产欧美| 99精品视频一区二区三区| 欧美一区二区视频在线观看2020 | 国产精品一级在线| 色香蕉成人二区免费| 久久综合中文字幕| 亚洲综合男人的天堂| 国产精品中文字幕日韩精品| 欧美性生活影院| 欧美国产日韩a欧美在线观看| 免费在线观看视频一区| 91成人免费网站| 国产精品久久久久久久久晋中 | 91在线视频网址| 久久久久国产成人精品亚洲午夜| 亚洲午夜成aⅴ人片| 丁香网亚洲国际| 欧美精品一区二区三区蜜桃 | 国产精品1区2区3区| 制服丝袜亚洲网站| 亚洲精品国产第一综合99久久| 国产丶欧美丶日本不卡视频| 日韩亚洲国产中文字幕欧美| 亚洲综合视频在线| 91蜜桃免费观看视频| 中文字幕精品一区二区三区精品| 久久99久国产精品黄毛片色诱| 欧美日韩在线播放三区四区| 亚洲欧美一区二区久久| 成人免费视频caoporn| 久久一区二区视频| 国产福利一区二区三区视频在线| 欧美理论在线播放| 日韩av在线播放中文字幕| 欧美日韩一级视频| 天天综合网天天综合色| 欧美久久久久免费| 日韩激情一区二区| 欧美不卡123| 国产一区二区三区在线观看免费视频| 26uuu久久综合| 国产精品正在播放| 国产精品女上位| 91黄色免费版| 午夜精品久久久久久久99樱桃 | 紧缚捆绑精品一区二区| 久久综合久久综合久久综合| 国产一区二区调教| 日韩码欧中文字| 欧美三级三级三级| 极品销魂美女一区二区三区| 国产欧美一区二区精品仙草咪| 国产精品538一区二区在线| 亚洲欧洲一区二区三区| 欧美午夜精品免费| 成人av资源站| 一区二区三区成人在线视频| 欧美日韩不卡视频| 精品制服美女丁香| 亚洲欧洲一区二区在线播放| 欧美另类变人与禽xxxxx| 国内精品不卡在线| 亚洲欧美一区二区三区久本道91| 欧美色视频在线| 国产精品综合视频| 一区二区国产盗摄色噜噜| 日韩一区二区三区高清免费看看 | av电影天堂一区二区在线观看| 亚洲女同女同女同女同女同69| 欧美精品日韩精品| 国产盗摄一区二区| 天天免费综合色| 国产精品嫩草影院com| 欧美日韩国产天堂| 国产成都精品91一区二区三| 亚洲高清免费在线| 中文子幕无线码一区tr| 91精品国产手机| 99视频精品在线| 精品亚洲成a人| 亚洲午夜在线电影| 国产精品天美传媒| 日韩精品一区二区三区中文不卡| 99久久久国产精品免费蜜臀| 精品一区精品二区高清| 亚洲国产一区视频| 亚洲视频网在线直播| 久久色成人在线| 91精品国产综合久久蜜臀| 91免费精品国自产拍在线不卡| 久久av资源站| 日韩精品一级中文字幕精品视频免费观看| 亚洲国产精品99久久久久久久久| 欧美一区二区三区爱爱| 欧洲在线/亚洲| 色综合天天做天天爱| 床上的激情91.| 国内久久精品视频| 日韩va亚洲va欧美va久久| 亚洲男人的天堂在线观看| 久久久久久久久蜜桃| 精品毛片乱码1区2区3区| 911国产精品| 欧美午夜精品一区| 欧美午夜精品免费| 欧美三级中文字幕| 欧美亚洲一区二区三区四区| 色婷婷综合在线| 色综合久久中文字幕| 91免费国产在线| 欧美在线视频日韩| 在线观看不卡一区| 欧美四级电影网| 欧美日韩亚洲另类| 欧美精品 日韩| 欧美一区永久视频免费观看| 91精品欧美一区二区三区综合在 | 美腿丝袜亚洲色图| 老司机精品视频线观看86| 美女视频一区在线观看| 蜜臂av日日欢夜夜爽一区| 久久99国产精品久久| 国产丶欧美丶日本不卡视频| 成人va在线观看| 91在线无精精品入口| 欧洲精品视频在线观看| 欧美日韩日日摸| 日韩欧美高清dvd碟片| 国产亚洲欧洲997久久综合| 中文字幕乱码久久午夜不卡 | 免费成人av资源网| 精品中文字幕一区二区| 国产激情一区二区三区四区| 成人精品视频.| 欧美视频一二三区| 日韩美女视频一区二区在线观看| 久久久国产综合精品女国产盗摄| 中日韩av电影| 亚洲高清免费在线| 国产精品亚洲第一区在线暖暖韩国| 成人性生交大片免费看视频在线 | 亚洲欧洲美洲综合色网| 有坂深雪av一区二区精品| 蜜桃一区二区三区在线| 大陆成人av片| 欧美精品在线观看一区二区| 精品久久久久久久人人人人传媒| 久久精品网站免费观看| 一区二区三区四区精品在线视频 | 亚洲另类春色校园小说| 免费高清在线视频一区·| www.日韩精品| 91精品国产91久久久久久最新毛片 | 国产成人av一区二区三区在线观看| 成人h动漫精品| 欧美一区二区三区爱爱| 亚洲人快播电影网| 国产成人在线免费| 精品视频在线免费|