使用Visual C++進行串口通信編程--2

(3)    串行數據的發送和接收

與普通的文件操作相同,在對串行口進行操作時,通常利用ReadFile函數讀取串行口收到的數據,利用WriteFile將需要發送的數據寫如串行口。

n        串行數據的接收

利用ReadFile函數可以讀取將串行口接收到的數據。ReadFile函數原型如下:

BOOL ReadFile

HANDLE hFile

LPVIOD   lpBuffer

DWORD   nNumberOfBytesToRead

LPDWORD   lpNumberOfBytesRead

LPOVERLAPPED lpOverlapped

);

其中參數hFile指向已經打開的串行口句柄;lpBuffer指向一個讀取數據緩衝區;nNumberOfBytesToRead指定要從串行設備中讀取的字節數;lpNumberOfBytesRead指明實際從串行口中讀出的字節數;lpOverlapped指向一個OVERLAPPED結構變量,該結構變量中包含一個同步事件。

通常如果調用成功,ReadFile返回非0值;否則返回值爲0。但是對於接收操作在後臺進行的串口來說,返回值爲0不一定說明函數調用失敗。此時可以調用GetLastError函數獲取進一步的信息。如果GetLastError返回值爲ERROR_IO_PENDING,則說明該讀取串口的操作仍然處於後臺等待狀態,而非一個真正意義上的錯誤。

n        串行數據的發送

利用WriteFile函數可以向串行口寫入數據。WriteFile函數原型如下:

BOOL WriteFile

HANDLE hFile

LPVIOD   lpBuffer

DWORD   nNumberOfBytesToWrite

LPDWORD   lpNumberOfBytesWritten

LPOVERLAPPED lpOverlapped

);

其中參數hFile指向已經打開的串行口句柄;lpBuffer指向一個發送數據緩衝區;nNumberOfBytesToRead指定要從串行設備中發送的字節數;lpNumberOfBytesRead指明實際從串行口中發送的字節數;lpOverlapped指向一個OVERLAPPED結構變量,該結構變量中包含一個同步事件。

通常如果調用成功,WriteFile返回非0值;否則返回值爲0。但是對於發送操作在後臺進行的串口來說,返回值爲0不一定說明函數調用失敗。此時可以調用GetLastError函數獲取進一步的信息。如果GetLastError返回值爲ERROR_IO_PENDING,則說明該寫入串口的操作仍然處於後臺等待狀態,而非一個真正意義上的錯誤。

(4)    關閉串行口

在用完串行口後通常要將其關閉。如果忘記關閉,該串口會始終處於打開狀態,其它的應用程序就不能打開或使用它。

關閉串口可以使用函數CloseHandle,其函數原型如下:

BOOL CloseHandle

    HANDLE hObject

);

CloseHandle函數非常簡單,其中hObject爲該打開串口的句柄。如果該函數調用成功,則返回值爲非0;否則返回值爲0

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章