Linux串列埠編寫

2021-06-18 01:31:36 字數 3050 閱讀 7353

最基本的串列埠程式設計無非涉及下面的幾點:

開啟串列埠;

設定串列埠,如波特率、數字,等;

讀/寫串列埠(接收資料、傳送資料);

關閉串列埠。

一、開啟串列埠

串列埠的開啟需要使用系統呼叫open,

int open_port(int port)

; /* ??? sizeof("/dev/ttyusb0")=12 */

if (port < 1 || port > 4)

error_ret("sorry, the port number must be 1~4.");

if (usb_serial)

sprintf(device, "/dev/ttyusb%d", port-1);

else

sprintf(device, "/dev/ttys%d", port-1);

//printf("%s %d\n", device, sizeof(device)); 

fd = open(device, o_rdwr | o_noctty | o_ndelay);

if (fd == -1)

unix_error_ret("unable to open the port");

/* block */

ret = fcntl(fd, f_setfl, 0);

if (ret < 0)

unix_error_ret("fcntl");

ret = isatty(stdin_fileno);

if (ret == 0)

error_ret("standard input is not a terminal device.");

debug_msg("open the port success!\n");

return fd;

}

二、關閉串列埠

串列埠的關閉十分簡單,直接使用系統呼叫close就可以了。**如下:

int close_port(int fd)

三、設定串列埠引數

串列埠的設定是最複雜的,先附上完整的**,之後再簡單說一下。

int setup_port(int fd, int speed, int data_bits, int parity, int stop_bits)

;int name_arr = ;

struct termios opt;

int ret=-1;

int i=0;

int len=0;

ret = tcgetattr(fd, &opt); /* get the port attr */

if (ret < 0)

unix_error_ret("unable to get the attribute");

opt.c_cflag |= (clocal | cread); /* enable the receiver, set local mode */

opt.c_cflag &= ~csize; /* mask the character size bits*/

/* baud rate */

len = sizeof(speed_arr) / sizeof(int);

for (i = 0; i < len; i++)

if (i == len)

error_ret("unsupported baud rate.");

}/* data bits */

switch (data_bits)

/* parity bits */

switch (parity)

/* stop bits */

switch (stop_bits)

/* raw input */

opt.c_lflag &= ~(icanon | echo | echoe | isig);

/* raw ouput */

opt.c_oflag &= ~opost;

tcflush(fd, tciflush);

opt.c_cc[vtime] = 0; /* no time out */

opt.c_cc[vmin] = 0; /* minimum number of characters to read */

ret = tcsetattr(fd, tcsanow, &opt); /* update it now */

if (ret < 0)

unix_error_ret("unable to setup the port.");

debug_msg("setup the port ok!\n");

return 0; /* everything is ok! */

}

首先使用tcgetattr獲取串列埠屬性。termios中的成員只能通過「與」("&")、「或」("|")來操作,而不能直接賦值。之後,設定控制標誌clocal和cread,這兩個選項可以保證程式不會變成埠的所有者,而埠所有者必須去處理發散性作業控制和結束通話訊號,同時還保證了序列介面驅動會讀取過來的資料位元組。在設定波特率時使用了點小技巧,就將最常用的放到陣列的最前面,校驗位也是如此。最後設定原始輸入/輸出,再使用這些屬性重新設定串列埠。

四、讀/寫串列埠

這兩個操作同樣簡單,就是使用系統呼叫read/write就行了。

本來打算使用兩個執行緒進行讀寫操作的,但不成功,後面用minicom讀取資料,而我們的串列埠程式只負責傳送。我是短接串列埠的2、3腳進行測試的。讓我不明白的是,為何這個程式不是獨佔串列埠?是不是上面的**設定了?這些將會隨著學習的深入而解決的。

下面是傳送資料的執行緒:

void *write_port_thread(void *argc)

pthread_exit(null);

}

我們的main函式:

int main(void)

C 編寫串列埠程式

下面闡述一下幾點 1 需要呼叫serialport類 示例 public static void main else name,message readthread.join serialport.close public static void read catch timeoutexceptio...

LINUX串列埠驅動(8250)的編寫與除錯

串列埠控制器都是大同小異,用3條位址線就可以完全對串列埠控制器進行控制。針對st554晶元來說,控制暫存器主要有thr 傳送保持暫存器 rhr 接收保持暫存器 ier 中斷使能暫存器 fcr 緩衝控制暫存器 lcr 控制暫存器 lsr 狀態暫存器 mcr 模式控制暫存器 msr 模式狀態暫存器 dl...

QT編寫串列埠除錯助手實現串列埠通訊

一 pro檔案新增串列埠 新增模組 qt serialport二 mainwindow.h 新增標頭檔案 include include例項化類,新增槽函式 按鈕可直接轉到槽,自己定義的槽函式要在private slots聲名 private qserialport serial private s...