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...