使用者常見的資料通訊的基本方式可分為並行通訊和序列通訊。
並行通訊是指利用多條資料傳輸線將乙個資料的各位同時傳送。特點是傳輸速度快,適用於短距離通訊,但要求傳輸速度較高的應用場合。
序列通訊是指利用一條傳輸線將資料一位位的順序傳送。特點是通訊線路簡單,利用簡單的線纜就可以實現通訊,減低成本,適用於遠距離通訊,但傳輸速度慢的應用場合。常用的串列埠有rs-232-c介面(全稱是「資料終端裝置(dte)和資料通訊裝置(dce)之間序列二進位制資料交換接**術標準」)。
uart控制器:可以工作在interrupt(中斷)模式或者dma(直接記憶體訪問)模式。據有16位元組的fifo(先入先出暫存器),支援最高波特率可達到230.4kbps。
uart操作:資料傳送、資料接收、產生中斷、產生波特率、loopback模式、紅外模式及自動流控制模式。
串列埠設定包括:波特率、起始位數量、資料位數量、停止位數量和流控協議。在此可以配置波特率為115200、起始位為1b、資料位8b、停止位1b和無流控制協議。
串列埠一、串列埠二對應裝置名依次是「/dev/ttys0」、「/dev/ttys1」。
在linux下對串列埠的讀寫可以使用簡單的「read」、「write」函式完成,不同的是需要對串列埠的其它引數另作設定。
6.4.2 串列埠設定詳情
串列埠設定主要是設定struct termios結構體成員值:
#include
struct termio
unsigned short c_iflag; /*輸入模式標誌*/
unsigned short c_oflag; /*輸出模式標誌*/
unsigned short c_cflag; /*控制模式標誌*/
unsigned short c_lfag; /*本地模式標誌*/
unsigned short c_line; /*line discipline*/
unsigned short c_cc[ncc]; /*control characters*/
通過對c_cflag的賦值,可以設定波特率、字元大小、資料位、停止位、奇偶校驗位和硬體流控等。
設定串列埠屬性基本流程:
1. 儲存原先串列埠配置
為了安全起見和以後除錯程式方便,可先儲存原先串列埠的配置,使用函式tcgetattr(fd,&oldtio)。該函式得到與fd指向物件的相關引數,並將它們儲存於lodtio引用的termios結構中。該函式可以測試配置是否正確、該串列埠是否可用等。除錯成功,函式返回0,失敗,函式返回-1.
if(tcgetattr(fd,&oldtio)!=0)
perror(「setupserial 1」);
return -1;
2. 啟用選項有clocal和cread
clocal和cread分別用於本地連線和接受使能,通過位掩碼的方式啟用這兩個選項。
newtio.c_cflag |= clocal | cread;
3. 設定波特率
設定波特率的函式主要有cfsetispeed和cfsetospeed。
cfsetispeed(&newtio,b115200);
cfsetospeed(&newtio,b115200);
一般地使用者需要將輸入輸出函式的波特率設定成一樣的。這幾個函式在成功時返回0,失敗-1。
4. 設定字元大小
沒有現成可用函式,需要位掩碼。一般先去除資料位中的位掩碼,再重新按要求設定。
options.c_cflag &= ~csize; /*mask the character size bits*/
options.c_cflag |= cs8;
5. 設定奇偶校驗位
先啟用c_cflag中的校驗位使能標誌parenb和是否要進行偶校驗,同時還要啟用c_iflag中的奇偶校驗使能。如使能奇校驗時,**如下:
newtio.c_cflag |= parenb;
newtio.c_cflag |=parodd;
newtio.c_iflag |= (inpck | istrip);
而使能偶校驗**為:
newtio.c_iflag |= (inpck | istrip);
newtio.c_cflag |= parenb;
newtio.c_cflag &= ~parood;
6. 設定停止位
通過啟用c_cflag中的cstopb而實現的。若停止位為1,則清除cstopb,若停止位為0,則啟用cstopb。下面是停止位為1時的**:
newtio.c_cflag &= ~cstopb;
7. 設定最少字元和等待時間
在對接收字元和等待時間沒有特別要求的情況下,可以將其設定為0:
newtio.c_cc[vtime] =0;
newtio.c_cc[vmin]=0;
8. 處理要寫入的引用物件
在串列埠重新設定之後,在之前要寫入的引用物件要重新處理,可呼叫函式tcflush(fd,queue_selector)來處理要寫入引用的物件。對於為傳輸的資料,或收到但未讀取的資料,其處理方法取決於queue_selector的值。
queue_selector可能取值:
tciflush:重新整理收到的資料但不讀
tcoflush:重新整理寫入的資料但不傳送
tciolflush:同時重新整理收到的資料但不讀,並且重新整理寫入的資料但不傳送
本例採用一:
tcflush(fd, tciflush)
9. 啟用配置
用到函式tcsetattr:
函式原型:tcsetattr(fd,option,&newtio);
這裡的newtio就是termios型別的變數,option可能的取值如下:
tcsanow:改變的配置立即生效
tcsadrain:改變的配置在所有寫入fd的輸出都結束後生效
tcsaflush:改變的配置自愛所有寫入fd引用物件的輸出都被結束後生效,所有已接受但為讀入的輸入都在改變發生前丟棄。
該函式呼叫成功返回0,失敗-1.
if((tcsetattr(fd,tcsanow,&newtio))!=0)
perror(「com set error」);
return -1;
/*串列埠配置的完整函式,為了函式的通用性,通常將常用的選項都在函式中列出,可大大方便以後使用者的除錯使用*/
int set_opt(int fd,int nspeed,int nbits,char nevent,int nstop)
bzero(&newtio,sizeof(newtio));
/*步驟一,設定字元大小*/
newtio.c_cflag |= clocal | cread;
newtio.c_cflag &= ~csize;
/*設定停止位*/
switch(nbits)
/*設定奇偶校驗位*/
switch(nevent)
/*設定波特率*/
switch(nspeed)
/*設定停止位*/
if(nstop==1)
newtio.c_cflag &= ~cstopb;
else if(nstop==2)
newtio.c_cflag |= cstopb;
/*設定等待時間和最小接收字元*/
newtio.c_cc[vtime] =0;
newtio.c_cc[vmin]=0;
/*處理未接受字元*/
tcflush(fd, tciflush);
/*啟用新配置*/
if((tcsetattr(fd,tcsanow,&newtio))!=0)
printf("set done!\n");
return 0;
}
linux串列埠程式設計
include 標準輸入輸出定義 include 標準函式庫定義 include unix標準函式定義 include include include 檔案控制定義 include ppsix終端控制定義 include 錯誤號定義 brief 設定串列埠通訊速率 param fd 型別 int 開...
Linux串列埠程式設計
串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...
Linux串列埠程式設計
串列埠概述 常見資料通訊方式 並行通訊,序列通訊 uart的主要操作 資料傳送及接受 產生中斷 產生波特率 loopback模式 紅外模式 自動流控模式 串列埠引數的配置主要包括 波特率 資料位 停止位 流控協議。linux中的串列埠裝置檔案放於 de 目錄下,串列埠一,串列埠二分別為 dev tt...