Linux 串列埠通訊

2021-06-04 01:43:51 字數 2640 閱讀 7482

011-08-03 13:04

389人閱讀收藏 

舉報以前跟著做過vxworks的開發,主要通訊方式是串列埠,因為底層bsp包已經做好了,串列埠通訊非常簡單。後來接觸linux,在一塊ok6410上跑linux串列埠通訊,才發現原來天真的以為甚是簡單的串列埠變得如此的不簡單。

#include

1、串列埠的操作

1.1開啟:fd = open("/dev/ttysac1", o_rdwr | o_noctty | o_ndelay);

o_rdwr 讀寫方式開啟;

o_noctty 不允許程序管理串列埠(不太理解,一般都選上);

o_ndelay 非阻塞(預設為阻塞,開啟後也可以使用fcntl()重新設定)

1.2寫入:n = write(fd, "linux", 5);

n實際寫入位元組數;

1.3讀取:res = read(fd,buf,len);

res 讀取的位元組數;

1.4設定:fcntl(fd, f_setfl, fndelay); //非阻塞

fcntl(fd, f_setfl, 0); // 阻塞

1.5關閉:close(fd);

2、串列埠配置

struct termios options;  // 串列埠配置結構體

tcgetattr(fd,&options); //獲取當前設定

bzero(&options,sizeof(options));

options.c_cflag  |= b115200 | clocal | cread; // 設定波特率,本地連線,接收使能

options.c_cflag &= ~csize; //遮蔽資料位

options.c_cflag  |= cs8; // 資料位為 8 ,cs7 for 7 

options.c_cflag &= ~cstopb; // 一位停止位, 兩位停止為 |= cstopb

options.c_cflag &= ~parenb; // 無校驗

|= parenb; //有校驗

&= ~parodd // 偶校驗

|=  parodd    // 奇校驗

options.c_cc[vtime] = 0; // 等待時間,單位百毫秒 (讀)。後有詳細說明

options.c_cc[vmin] = 0; // 最小位元組數 (讀)。後有詳細說明

tcflush(fd, tcioflush); // tciflush刷清輸入佇列。

tcoflush刷清輸出佇列。 

tcioflush刷清輸入、輸出佇列。

tcsetattr(fd, tcsanow, &options); // tcsanow立即生效;

tcsadrain:wait until everything has been transmitted;

tcsaflush:flush input and output buffers and make the change

3、vtime 和  vmin

vtime  定義要求等待的零到幾百毫秒的值(通常是乙個8位的unsigned char變數)。

vmin 定義了要求等待的最小位元組數, 這個位元組數可能是0。

只有設定為阻塞時這兩個引數才有效,僅針對於讀操作。

說起來比較複雜,舉個例子吧,設定為阻塞狀態,寫操作未進行實驗,這裡僅討論讀操作,

read(fd,&buf,8); // 讀串列埠

3.1 

options.c_cc[vtime] = 0;

options.c_cc[vmin] = 0;

vmin = 0,當緩衝區位元組數 >= 0 時進行讀操作,實際上這時讀串列埠操作並未被阻塞,因為條件始終被滿足。

3.2options.c_cc[vtime] = 0;

options.c_cc[vmin] = 1;

vmin = 1,當緩衝區位元組數 >= 1 時進行讀操作,當沒有資料時讀串列埠操作被阻塞。

3.3options.c_cc[vtime] = 0;

options.c_cc[vmin] = 4;

vmin = 4,當緩衝區位元組數 >= 4 時進行讀操作,否則讀串列埠操作被阻塞。每次讀出的最大位元組數由read函式中第三個引數決定。直到緩衝區剩下的資料< read 第三個引數 並且< 4 (如果這時read第三引數為 1 則進行4次讀操作直至讀完緩衝區,如read第三引數為2,連續進行讀操作,直至緩衝區空或還剩乙個字元)。沒有設定vtime,剩下的字元沒有確定的期限,直到下次滿足讀條件的時候才被讀出。

----------------------------------考慮vtime-----------------------------

3.4options.c_cc[vtime] = 10; //單位百毫秒

options.c_cc[vmin] = 4;

同3.3的區別就是,沒滿足條件或讀

緩衝區中剩下的資料會在1秒(10百毫秒)後讀出。另外特別注意的是當設定vtime後,如果read第三個引數小於vmin ,將會將vmin 修改為read的第三個引數,即使用read(fd,&buf,2);,以上設定變為:

options.c_cc[vtime] = 10;

options.c_cc[vmin] = 2;

Linux下串列埠通訊

1.開啟串列埠 與其他的關於裝置程式設計的方法一樣,在linux下,操作 控制串列埠也是通過操作起裝置檔案進行的。在linux下,串列埠的裝置檔案是 dev ttys0或 dev ttys1等。因此要讀寫串列埠,我們首先要開啟串列埠 char dev dev ttys0 串列埠1 int fd op...

linux 下串列埠通訊

include include include include include include include include include define baudrate b115200 baud rate 115200 define device dev ttyama0 define size...

linux下串列埠通訊

配置串列埠 sudo stty f dev ttys1 115200 raw echo echoe echok crtscts 更改許可權 sudo chmod 777 dev ttys1 向串列埠輸出資料 sudo echo hello,world dev ttys1然後在另一主機的輸出端檢視輸出...