串列埠概述
使用者常見的資料通訊的基本方式可分為並行通訊和序列通訊。
並行通訊是指利用多條資料傳輸線將乙個資料的各位同時傳送。特點是傳輸速度快,適用於短距離通訊,但要求傳輸速度較 高的應用場合。
序列通訊是指利用一條傳輸線將資料一位位的順序傳送。特點是通訊線路簡單,利用簡單的線纜就可以實現通訊,減低成 本,適用於遠距離通訊,但傳輸速度慢的應用場合。常用的串列埠有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 ;
通過對c_cflag 的賦值,可以設定 波特率、字元大小、資料位、停止位、奇偶校驗位和硬體流控等。
設定串列埠屬性基本流程:
1. 儲存原先串列埠配置
為了安全起見和以後除錯程式方便,可先儲存原先串列埠的配置,使用函式tcgetattr (fd ,&oldtio )。該函式得到與fd 指向物件的相關引數,並將它們儲存於lodtio 引 用的termios 結構中。該函式可以測試配置是否正確、該串列埠是否可用等。 除錯成功,函式返回0 ,失敗,函式返回-1.
if(tcgetattr(fd,&oldtio)!=0)
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)
/*串列埠配置的完整函式,為了函式的通用性,通常將常用的選項都在 函式中列出,可大大方便以後使用者的除錯使用*/
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;}
準備篇 串列埠通訊概述
前言 最近家裡有些事情所以這個系列的文章一直耽擱了,現在開始進行編寫希望各位看官見諒,這個系列是我對之前一段時間工作的總結也是我自己的複習和重構,本著互相學習的目的,如果我在其中有理解錯誤和方向不對的地方還請大家指正。1.1 什麼是串列埠 什麼是串列埠其實應該首先說什麼是通訊,不過 通訊 二字對於我...
Linux串列埠除錯
在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問 題的時候不知如何處理了。好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操...
linux串列埠除錯
在第一次除錯linux串列埠驅動的時候,一定要保證與linux串列埠通訊的器件是沒有問題可以使用的,然後我們再進行串列埠操作的學習,否則也許可能碰到問題的時候不知如何處理了。好了,在保證硬體已經沒有問題的情況下,我們開始學習串列埠驅動模組的使用。pc上的串列埠不比嵌入式,你可以在了解了暫存器之後操作...