最基本的串列埠程式設計無非涉及下面的幾點:
開啟串列埠;
設定串列埠,如波特率、數字,等;
讀/寫串列埠(接收資料、傳送資料);
關閉串列埠。
一、開啟串列埠
串列埠的開啟需要使用系統呼叫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)首先使用tcgetattr獲取串列埠屬性。termios中的成員只能通過「與」("&")、「或」("|")來操作,而不能直接賦值。之後,設定控制標誌clocal和cread,這兩個選項可以保證程式不會變成埠的所有者,而埠所有者必須去處理發散性作業控制和結束通話訊號,同時還保證了序列介面驅動會讀取過來的資料位元組。在設定波特率時使用了點小技巧,就將最常用的放到陣列的最前面,校驗位也是如此。最後設定原始輸入/輸出,再使用這些屬性重新設定串列埠。;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! */
}
四、讀/寫串列埠
這兩個操作同樣簡單,就是使用系統呼叫read/write就行了。
本來打算使用兩個執行緒進行讀寫操作的,但不成功,後面用minicom讀取資料,而我們的串列埠程式只負責傳送。我是短接串列埠的2、3腳進行測試的。讓我不明白的是,為何這個程式不是獨佔串列埠?是不是上面的**設定了?這些將會隨著學習的深入而解決的。
下面是傳送資料的執行緒:
void *write_port_thread(void *argc)我們的main函式:pthread_exit(null);
}
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...