嵌入式Linux串列埠應用程式設計之串列埠讀寫

2021-06-18 02:33:14 字數 2834 閱讀 2492

2013-08-27

在配置完串列埠的相關屬性後,就可以對串列埠進行開啟和讀寫操作了。它所使用的函式和普通檔案的讀寫函式一樣,都是open()、write()和read()。它們之間區別的只是串列埠是乙個終端裝置,因此在選擇函式的具體引數時會有一些區別。另外,這裡會用到一些附加的函式,用於測試終端裝置的連線情況等。下面將對其進行具體講解。

1.開啟串列埠

開啟串列埠和開啟普通檔案一樣,都是使用open()函式,如下所示:

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

可以看到,這裡除了普通的讀寫引數外,還有兩個引數o_noctty和o_ndelay。

● o_noctty標誌用於通知linux系統,該引數不會使開啟的檔案成為這個程序的控制終端。如果沒有指定這個標誌,那麼任何乙個輸入(如鍵盤中止訊號等)都將會影響使用者的程序。

● o_ndelay標誌用於設定非阻塞方式。通知linux系統,這個程式不關心dcd訊號線所處的狀態(埠的另一端是否啟用或者停止)。如果使用者沒有指定這個標誌,則程序將會一直處在睡眠狀態,直到dcd訊號線被啟用。

接下來可恢復串列埠的狀態為阻塞狀態,用於等待串列埠資料的讀入,可用fcntl()函式實現,如下所示:

fcntl(fd, f_setfl, 0);

接著可以測試開啟的檔案描述符是否連線到乙個終端裝置,以進一步確認串列埠是否正確開啟,如下所示:

isatty(fd);

該函式呼叫成功則返回0,若失敗則返回-1。

這時,乙個串列埠就已經成功開啟了。接下來就可以對這個串列埠進行讀和寫操作。下面給出了乙個完整的開啟串列埠函式,同樣考慮到了各種不同的情況。程式如下所示:

/*開啟串列埠函式*/

int open_port(int com_port)

;#else /* 使用usb轉串列埠 */

char *dev = ;

#endif

if ((com_port < 0) || (com_port > max_com_num))

/* 開啟串列埠 */

fd = open(dev[com_port - 1], o_rdwr|o_noctty|o_ndelay);

if (fd < 0)

if (fcntl(fd, f_setfl, 0) < 0) /* 恢復串列埠為阻塞狀態 */

if (isatty(fd) == 0) /* 測試開啟的檔案是否為終端裝置 */

return fd;}

2.讀寫串列埠

讀寫串列埠操作與讀寫普通檔案一樣,使用read()和write()函式即可,如下所示:

read(fd, buff, buffer_size);

write(fd, buff, strlen(buff));

下面兩個例項給出了串列埠讀和寫的兩個程式,其中用到前面所講述的open_port()和set_com_config ()函式。寫串列埠的程式將在宿主機上執行,讀串列埠的程式將在目標板上執行。

寫串列埠的程式如下所示:

/* com_writer.c */

#include

#include

#include

#include

#include

#include

#include "uart_api.h"

int main(void)

if(set_com_config(fd, 115200, 8, 'n', 1) < 0) /* 配置串列埠 */ do

write(fd, buff, strlen(buff));

} while(strncmp(buff, "quit", 4));

close(fd);

return 0;}

讀串列埠的程式如下所示:

/* com_reader.c */

#include

#include

#include

#include

#include

#include

#include "uart_api.h"

int main(void)

if(set_com_config(fd, 115200, 8, 'n', 1) < 0) /* 配置串列埠 */

do} while(strncmp(buff, "quit", 4));

close(fd);

return 0;}

在宿主機上執行寫串列埠的程式,而在目標板上執行讀串列埠的程式,執行結果如下所示:

/* 宿主機 ,寫串列埠 */

$ ./com_writer

input some words(enter 'quit' to exit):hello, reader!

input some words(enter 'quit' to exit):i'm writer!

input some words(enter 'quit' to exit):this is a serial port testing program.

input some words(enter 'quit' to exit):quit

/* 目標板 ,讀串列埠 */

$ ./com_reader

the received words are : hello, reader!

the received words are : i'm writer!

the received words are : this is a serial port testing program.

the received words are : quit

另外,讀者還可以考慮一下如何使用select()函式實現串列埠的非阻塞讀寫,具體例項會在本章後面的實驗中給出。

嵌入式應用程式開發

嵌入式應用程式開發 實驗目的 1.編寫程式,用交叉工具鏈編譯連線 實驗原理 1.嵌入式應用程式的開發一般都在宿主機平台上進行,利用交叉編譯器編譯,生成可以在目標平台上執行的可執行 本實驗使用的交叉編譯器是arm linux gcc 實驗內容 l include include int main l2...

嵌入式LINUX應用程式開發詳解

本書主要分為3個部分,包括linux基礎 搭建嵌入式linux環境和嵌入式linux的應用開發。linux基礎部分從linux的安裝過程 基本操作命令講起,為linux初學者能快速入門提供了保證。接著系統地講解了嵌入式linux的環境搭建,以及嵌入式linux的i o與檔案系統的開發 程序控制開發 ...

嵌入式linux應用程式移植方法總結

前段時間一直在做opencapwap的移植和除錯工作,現在工作已接近尾聲,編寫本文件對前段工作進行乙個總結,分享下opencapwap移植過程中的經驗和感悟。江浩寫的 capwap移植進展.docx 對opencapwap的移植過程有了比較詳細的描述,所以在此就不涉及技術細節了,本文件主要以open...