常見資料通訊方式:並行通訊,序列通訊
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、cfsetospeedcfsetispeed(&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是以...