(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。