UART串列埠程式設計

2021-08-28 03:34:09 字數 3988 閱讀 3110

常見資料通訊方式:並行通訊,序列通訊

uart的主要操作

資料傳送及接受

產生中斷

產生波特率

loopback模式

紅外模式

自動流控模式

串列埠引數的配置主要包括:波特率、資料位、停止位、流控協議。

linux中的串列埠裝置檔案放於/dev/目錄下,串列埠一,串列埠二分別為"/dev/ttys0","/dev/ttys1".在linux下操作串列埠與操作檔案相同.

串列埠詳細配置

包括:波特率、資料位、校驗位、停止位等。串列埠設定由下面的結構體實現:

struct termios

;

該結構體中c_cflag最為重要,可設定波特率、資料位、校驗位、停止位。在設定波特率時需要在數字前加上』b』,

如b9600,b15200.使用其需通過「與」「或」操作方式:

輸入模式c_iflag成員控制埠接收端的字元輸入處理:

cgetattr 取屬性(termios結構)

tcsetattr 設定屬性(termios結構)

cfgetispeed 得到輸入速度

cfgetospeed 得到輸出速度

cfsetispeed 設定輸入速度

cfsetospeed 設定輸出速度

tcdrain 等待所有輸出都被傳輸

tcflow 掛起傳輸或接收

tcflush 刷清未決輸入和/或輸出

tcsendbreak 送break字元

tcgetpgrp 得到前台程序組id

tcsetpgrp 設定前台程序組id配置流程

1> 儲存原先串列埠配置,用tcgetattr(fd,&oldtio)函式

struct termios newtio,oldtio;

tcgetattr(fd,&oldtio);

2>啟用選項有clocal和cread,用於本地連線和接收使用
newtio.c_cflag | = clocal | cread;
3>設定波特率,使用函式cfsetispeed、cfsetospeed
cfsetispeed(&newtio,b115200);

cfsetospeed(&newtio,b115200);

4>設定資料位,需使用掩碼設定
newtio.c_cflag &= ~csize;

newtio.c_cflag |= cs8;

5>設定奇偶校驗位,使用c_cflag和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 |= ~parodd;

不進行校驗:

newtio.c_cflag &= ~parenb;

6>設定停止位,通過啟用c_cflag中的cstopb實現。若停止位為1,則清cstopb,若停止位為2,則啟用cstopb。

newtio.c_cflag &= ~cstopb;

if( nstop == 1 )

newtio.c_cflag &= ~cstopb;

else if ( nstop == 2 )

newtio.c_cflag |= cstopb;

7>設定最少字元和等待時間,對於接收字元和等待時間沒有特別的要求時,可設為0:
newtio.c_cc[vtime] = 0;

newtio.c_cc[vmin] = 0;

8>處理要寫入的引用物件

tcflush函式刷清(拋棄)輸入快取(終端驅動程式已接收到,但使用者程式尚未讀)或輸出快取(使用者程式已經寫,但尚未傳送).

int tcflush(int filedes,int quene)

quene數應當是下列三個常數之一:

*tciflush 刷清輸入佇列

*tcoflush 刷清輸出佇列

*tcioflush 刷清輸入、輸出佇列

例如:tcflush(fd,tciflush);

9>啟用配置。在完成配置後,需要啟用配置使其生效。使用tcsetattr()函式:

int tcsetattr(int filedes,int opt,const struct termios *termptr);

opt使我們可以指定在什麼時候新的終端屬性才起作用,

例如: tcsetattr(fd,tcsanow,&newtio);

串列埠使用詳解

開啟串列埠

fd = open("/dev/ttys0",o_rdwr | o_noctty | o_ndelay);
引數

o_noctty:通知linux系統,這個程式不會成為這個埠的控制終端.

o_ndelay:通知linux系統不關心dcd訊號線所處的狀態(埠的另一端是否啟用或者停止).

然後恢復串列埠的狀態為阻塞狀態,用於等待串列埠資料的讀入,用fcntl函式:

fcntl(fd,f_setfl,0);  //f_setfl:設定檔案flag為0,即預設,即阻塞狀態
接著測試開啟的檔案描述符是否應用乙個終端裝置,以進一步確認串列埠是否正確開啟.

isatty(stdin_fileno);
讀寫串列埠

串列埠的讀寫與普通檔案一樣,使用read,write函式

read(fd,buff,8);

write(fd,buff,8);

初始化**如下:

#include #include #include #include #include #include #include #include int set_opt(int,int,int,char,int);

//"/dev/ttysac3"是con2,對con2進行操作

void main()

} }}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\r");

return 0;

}

UART串列埠通訊

先簡單說說串列埠通訊 uart 我做的這個實驗只針對rs232標準,在fpga與上位機給出的rs232口之間通過電平轉換電路 最上面圖中的max232晶元 實現ttl電平與rs232電平之間的轉換。我們只關心rs232 tx和rs232 rx兩個訊號,rs232 tx是資料傳送埠,rs232 rx是...

匯流排 UART串列埠通訊

uart universal asynchronous receiver transmitter,通用非同步接收 傳送裝置 不知道資料什麼時候來 soc和pc等裝置都是ttl電平 0v 為 0 3.3v 5v為1 電平轉換模組的作用 因為串列埠用於遠距離通訊,會影響到電路的電壓,如果還是如上面這樣採...

uart串列埠學習筆記

uart是universal asynchronous receiver and transmitter簡稱,中文為通用非同步接收和傳送器,是常用的序列通訊介面。uart的作用是列印串列埠輸出資訊和連線各種外用裝置 優點是硬體簡單,而且傳輸資訊穩定 但是缺點也很明顯,傳輸資訊非常慢,因為uart是以...