文件I/O編程之: 嵌入式Linux串口應用編程
6.4嵌入式Linux串口應用編程
6.4.1串口概述
常見(jiàn)的數據通信的基本方式可分為并行通信與串行通信兩種。
n 并行通信是指利用多條數據傳輸線(xiàn)將一個(gè)字數據的各比特位同時(shí)傳送。它的特點(diǎn)是傳輸速度快,適用于傳輸距離短且傳輸速度較高的通信。
n 串行通信是指利用一條傳輸線(xiàn)將數據以比特位為單位順序傳送。特點(diǎn)是通信線(xiàn)路簡(jiǎn)單,利用簡(jiǎn)單的線(xiàn)纜就可實(shí)現通信,降低成本,適用于傳輸距離長(cháng)且傳輸速度較慢的通信。
串口是計算機一種常用的接口,常用的串口有RS-232-C接口。它是于1970年由美國電子工業(yè)協(xié)會(huì )(EIA)聯(lián)合貝爾系統、調制解調器廠(chǎng)家及計算機終端生產(chǎn)廠(chǎng)家共同制定的用于串行通信的標準,它的全稱(chēng)是“數據終端設備(DTE)和數據通信設備(DCE)之間串行二進(jìn)制數據交換接口技術(shù)標準”。該標準規定采用一個(gè)DB25芯引腳的連接器或9芯引腳的連接器,其中25芯引腳的連接器如圖6.3所示。
圖6.325引腳串行接口圖
S3C2410X內部具有兩個(gè)獨立的UART控制器,每個(gè)控制器都可以工作在Interrupt(中斷)模式或者DMA(直接存儲訪(fǎng)問(wèn))模式。同時(shí),每個(gè)UART均具有16字節的FIFO(先入先出寄存器),支持的最高波特率可達到230.4Kbps。UART的操作主要可分為以下幾個(gè)部分:數據發(fā)送、數據接收、產(chǎn)生中斷、設置波特率、Loopback模式、紅外模式以及硬軟流控模式。
串口參數的配置讀者在配置超級終端和minicom時(shí)也已經(jīng)接觸過(guò),一般包括波特率、起始位比特數、數據位比特數、停止位比特數和流控模式。在此,可以將其配置為波特率115200、起始位1b、數據位8b、停止位1b和無(wú)流控模式。
在Linux中,所有的設備文件一般都位于“/dev”下,其中串口1和串口2對應的設備名依次為“/dev/ttyS0”和“/dev/ttyS1”,而且USB轉串口的設備名通常為“/dev/ttyUSB0”和“/dev/ttyUSB1”(因版本不同該設備名會(huì )有所不同),可以查看在“/dev”下的文件以確認。在本章中已經(jīng)提到過(guò),在Linux下對設備的操作方法與對文件的操作方法是一樣的,因此,對串口的讀寫(xiě)就可以使用簡(jiǎn)單的read()、write()函數來(lái)完成,所不同的只是需要對串口的其他參數另做配置,下面就來(lái)詳細講解串口應用開(kāi)發(fā)的步驟。
6.4.2串口設置詳解
串口的設置主要是設置structtermios結構體的各成員值,如下所示:
#includetermios.h>
structtermios
{
unsignedshortc_iflag;/*輸入模式標志*/
unsignedshortc_oflag;/*輸出模式標志*/
unsignedshortc_cflag;/*控制模式標志*/
unsignedshortc_lflag;/*本地模式標志*/
unsignedcharc_line;/*線(xiàn)路規程*/
unsignedcharc_cc[NCC];/*控制特性*/
speed_tc_ispeed;/*輸入速度*/
speed_tc_ospeed;/*輸出速度*/
};
termios是在POSIX規范中定義的標準接口,表示終端設備(包括虛擬終端、串口等)??谑且环N終端設備,一般通過(guò)終端編程接口對其進(jìn)行配置和控制。在具體講解串口相關(guān)編程之前,先了解一下終端相關(guān)知識。
終端有3種工作模式,分別為規范模式(canonicalmode)、非規范模式(non-canonicalmode)和原始模式(rawmode)。
通過(guò)在termios結構的c_lflag中設置ICANNON標志來(lái)定義終端是以規范模式(設置ICANNON標志)還是以非規范模式(清除ICANNON標志)工作,默認情況為規范模式。
在規范模式下,所有的輸入是基于行進(jìn)行處理。在用戶(hù)輸入一個(gè)行結束符(回車(chē)符、EOF等)之前,系統調用read()函數讀不到用戶(hù)輸入的任何字符。除了EOF之外的行結束符(回車(chē)符等)與普通字符一樣會(huì )被read()函數讀取到緩沖區之中。在規范模式中,行編輯是可行的,而且一次調用read()函數最多只能讀取一行數據。如果在read()函數中被請求讀取的數據字節數小于當前行可讀取的字節數,則read()函數只會(huì )讀取被請求的字節數,剩下的字節下次再被讀取。
在非規范模式下,所有的輸入是即時(shí)有效的,不需要用戶(hù)另外輸入行結束符,而且不可進(jìn)行行編輯。在非規范模式下,對參數MIN(c_cc[VMIN])和TIME(c_cc[VTIME])的設置決定read()函數的調用方式。設置可以有4種不同的情況。
n MIN=0和TIME=0:read()函數立即返回。若有可讀數據,則讀取數據并返回被讀取的字節數,否則讀取失敗并返回0。
n MIN>0和TIME=0:read()函數會(huì )被阻塞直到MIN個(gè)字節數據可被讀取。
n MIN=0和TIME>0:只要有數據可讀或者經(jīng)過(guò)TIME個(gè)十分之一秒的時(shí)間,read()函數則立即返回,返回值為被讀取的字節數。如果超時(shí)并且未讀到數據,則read()函數返回0。
n MIN>0和TIME>0:當有MIN個(gè)字節可讀或者兩個(gè)輸入字符之間的時(shí)間間隔超過(guò)TIME個(gè)十分之一秒時(shí),read()函數才返回。因為在輸入第一個(gè)字符之后系統才會(huì )啟動(dòng)定時(shí)器,所以在這種情況下,read()函數至少讀取一個(gè)字節之后才返回。
按照嚴格意義來(lái)講,原始模式是一種特殊的非規范模式。在原始模式下,所有的輸入數據以字節為單位被處理。在這個(gè)模式下,終端是不可回顯的,而且所有特定的終端輸入/輸出控制處理不可用。通過(guò)調用cfmakeraw()函數可以將終端設置為原始模式,而且該函數通過(guò)以下代碼可以得到實(shí)現。
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;
下面講解設置串口的基本方法。設置串口中最基本的包括波特率設置,校驗位和停止位設置。在這個(gè)結構中最為重要的是c_cflag,通過(guò)對它的賦值,用戶(hù)可以設置波特率、字符大小、數據位、停止位、奇偶校驗位和硬軟流控等。另外c_iflag和c_cc也是比較常用的標志。在此主要對這3個(gè)成員進(jìn)行詳細說(shuō)明。c_cflag支持的常量名稱(chēng)如表6.11所示。其中設置波特率宏名為相應的波特率數值前加上‘B’,由于數值較多,本表沒(méi)有全部列出。
linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)linux相關(guān)文章:linux教程
評論