<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁 > 嵌入式系統 > 設計應用 > 文件I/O編程之: 嵌入式Linux串口應用編程

          文件I/O編程之: 嵌入式Linux串口應用編程

          作者: 時間:2013-09-13 來源:網絡 收藏

          本文引用地址:http://www.ex-cimer.com/article/257136.htm

          6.4嵌入式應用編程

          6.4.1概述

          常見的數據通信的基本方式可分為并行通信與串行通信兩種。

          n 并行通信是指利用多條數據傳輸線將一個字數據的各比特位同時傳送。它的特點是傳輸速度快,適用于傳輸距離短且傳輸速度較高的通信。

          n 串行通信是指利用一條傳輸線將數據以比特位為單位順序傳送。特點是通信線路簡單,利用簡單的線纜就可實現通信,降低成本,適用于傳輸距離長且傳輸速度較慢的通信。

          是計算機一種常用的接口,常用的串口有RS-232-C接口。它是于1970年由美國電子工業(yè)協會(EIA)聯合貝爾系統、調制解調器廠家及計算機終端生產廠家共同制定的用于串行通信的標準,它的全稱是“數據終端設備(DTE)和數據通信設備(DCE)之間串行二進制數據交換接口技術標準”。該標準規(guī)定采用一個DB25芯引腳的連接器或9芯引腳的連接器,其中25芯引腳的連接器如圖6.3所示。

          圖6.325引腳串行接口圖

          S3C2410X內部具有兩個獨立的UART控制器,每個控制器都可以工作在Interrupt(中斷)模式或者DMA(直接存儲訪問)模式。同時,每個UART均具有16字節(jié)的FIFO(先入先出寄存器),支持的最高波特率可達到230.4Kbps。UART的操作主要可分為以下幾個部分:數據發(fā)送、數據接收、產生中斷、設置波特率、Loopback模式、紅外模式以及硬軟流控模式。

          串口參數的配置讀者在配置超級終端和minicom時也已經接觸過,一般包括波特率、起始位比特數、數據位比特數、停止位比特數和流控模式。在此,可以將其配置為波特率115200、起始位1b、數據位8b、停止位1b和無流控模式。

          中,所有的設備文件一般都位于“/dev”下,其中串口1和串口2對應的設備名依次為“/dev/ttyS0”和“/dev/ttyS1”,而且USB轉串口的設備名通常為“/dev/ttyUSB0”和“/dev/ttyUSB1”(因版本不同該設備名會有所不同),可以查看在“/dev”下的文件以確認。在本章中已經提到過,在下對設備的操作方法與對文件的操作方法是一樣的,因此,對串口的讀寫就可以使用簡單的read()、write()函數來完成,所不同的只是需要對串口的其他參數另做配置,下面就來詳細講解串口應用開發(fā)的步驟。

          6.4.2串口設置詳解

          串口的設置主要是設置structtermios結構體的各成員值,如下所示:

          #includetermios.h>

          structtermios

          {

          unsignedshortc_iflag;/*輸入模式標志*/

          unsignedshortc_oflag;/*輸出模式標志*/

          unsignedshortc_cflag;/*控制模式標志*/

          unsignedshortc_lflag;/*本地模式標志*/

          unsignedcharc_line;/*線路規(guī)程*/

          unsignedcharc_cc[NCC];/*控制特性*/

          speed_tc_ispeed;/*輸入速度*/

          speed_tc_ospeed;/*輸出速度*/

          };

          termios是在POSIX規(guī)范中定義的標準接口,表示終端設備(包括虛擬終端、串口等)??谑且环N終端設備,一般通過終端編程接口對其進行配置和控制。在具體講解串口相關編程之前,先了解一下終端相關知識。

          終端有3種工作模式,分別為規(guī)范模式(canonicalmode)、非規(guī)范模式(non-canonicalmode)和原始模式(rawmode)。

          通過在termios結構的c_lflag中設置ICANNON標志來定義終端是以規(guī)范模式(設置ICANNON標志)還是以非規(guī)范模式(清除ICANNON標志)工作,默認情況為規(guī)范模式。

          在規(guī)范模式下,所有的輸入是基于行進行處理。在用戶輸入一個行結束符(回車符、EOF等)之前,系統調用read()函數讀不到用戶輸入的任何字符。除了EOF之外的行結束符(回車符等)與普通字符一樣會被read()函數讀取到緩沖區(qū)之中。在規(guī)范模式中,行編輯是可行的,而且一次調用read()函數最多只能讀取一行數據。如果在read()函數中被請求讀取的數據字節(jié)數小于當前行可讀取的字節(jié)數,則read()函數只會讀取被請求的字節(jié)數,剩下的字節(jié)下次再被讀取。

          在非規(guī)范模式下,所有的輸入是即時有效的,不需要用戶另外輸入行結束符,而且不可進行行編輯。在非規(guī)范模式下,對參數MIN(c_cc[VMIN])和TIME(c_cc[VTIME])的設置決定read()函數的調用方式。設置可以有4種不同的情況。

          n MIN=0和TIME=0:read()函數立即返回。若有可讀數據,則讀取數據并返回被讀取的字節(jié)數,否則讀取失敗并返回0。

          n MIN>0和TIME=0:read()函數會被阻塞直到MIN個字節(jié)數據可被讀取。

          n MIN=0和TIME>0:只要有數據可讀或者經過TIME個十分之一秒的時間,read()函數則立即返回,返回值為被讀取的字節(jié)數。如果超時并且未讀到數據,則read()函數返回0。

          n MIN>0和TIME>0:當有MIN個字節(jié)可讀或者兩個輸入字符之間的時間間隔超過TIME個十分之一秒時,read()函數才返回。因為在輸入第一個字符之后系統才會啟動定時器,所以在這種情況下,read()函數至少讀取一個字節(jié)之后才返回。

          按照嚴格意義來講,原始模式是一種特殊的非規(guī)范模式。在原始模式下,所有的輸入數據以字節(jié)為單位被處理。在這個模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過調用cfmakeraw()函數可以將終端設置為原始模式,而且該函數通過以下代碼可以得到實現。

          termios_p->c_iflag=~(IGNBRK|BRKINT|PARMRK|ISTRIP

          |INLCR|IGNCR|ICRNL|IXON);

          termios_p->c_oflag=~OPOST;

          termios_p->c_lflag=~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);

          termios_p->c_cflag=~(CSIZE|PARENB);

          termios_p->c_cflag|=CS8;

          下面講解設置串口的基本方法。設置串口中最基本的包括波特率設置,校驗位和停止位設置。在這個結構中最為重要的是c_cflag,通過對它的賦值,用戶可以設置波特率、字符大小、數據位、停止位、奇偶校驗位和硬軟流控等。另外c_iflag和c_cc也是比較常用的標志。在此主要對這3個成員進行詳細說明。c_cflag支持的常量名稱如表6.11所示。其中設置波特率宏名為相應的波特率數值前加上‘B’,由于數值較多,本表沒有全部列出。

          linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

          linux相關文章:linux教程



          上一頁 1 2 3 4 5 下一頁

          評論


          相關推薦

          技術專區(qū)

          關閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();