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