在WINDOWS NT4.0 以上操作系統中,串口通訊有2種模式:同步方式和異步方式。由
CreateFile中的
dwFlagsAndAttributes參數決定,
若指定FILE_FLAG_OVERLAPPED標志則為異步方式,否則為同步方式。當為同步模式時,調用ReadFile或WriteFile會阻塞調用線程直到讀完或寫完指定量的數據才返回,這樣就有可能出現無法退出程序的現象,解決方法是為讀寫操作設置超時,注意這種超時指的是ReadFile或WriteFile函數的返回時間,僅對同步模式有效。代碼如下
1
//以下m_pComPort為本人自己封裝的C++串口類CComPort的指針
2
3
// FALSE表示以同步方式打開
4
m_pComPort->Open(2, FALSE, 38400);
5
6
//設置讀寫超時為5秒
7 COMMTIMEOUTS timeout = { 0 };
8
timeout.ReadTotalTimeoutConstant = 5000;
9
timeout.WriteTotalTimeoutConstant = 5000;
10
m_pCommPort->SetTimeouts(timeout);
11
12 char szData[1024] = { 0 };
13
//讀數據
14
DWORD dwRet = m_pCommPort->ReadComm(szData, 1024);
15
//寫數據
16
dwRet = m_pCommPort->WriteComm(szData, 1024);
17
//關閉串口
18
m_pCommPort->Close();
當為異步模式時,由于讀寫操作會立即返回,因此設置超時指的是設置等待操作完成的時間,而不是
ReadFile或
WriteFile函數返回的時間,代碼如下
1
//以下m_pComPort為本人自己封裝的C++串口類CComPort的指針
2
3
// TRUE表示以異步方式打開
4
m_pComPort->Open(2, TRUE, 38400);
5
6
//設置讀寫等待超時為5秒
7 char szData[1024] = { 0 };
8
9
//當第3個參數為0時,讀寫操作會立即返回
10
//讀數據
11
DWORD dwRet = m_pCommPort->ReadComm(szData, 1024, 5000);
12
//寫數據
13
dwRet = m_pCommPort->WriteComm(szData, 1024, 5000);
14
//關閉串口
15
m_pCommPort->Close();
這里的
ReadComm和
WriteComm的實現內部針對不同模式作了不同處理,異步模式時即調用了
WaitForSingleObject等待函數來設置超時。同步模式時即調用不帶重疊結構的
ReadFile或
WriteFile函數來接收或發送指定量的數據。另外在這介紹下串口虛擬軟件vspd,這個軟件能模擬在同一臺計算機上進行兩個串口的通訊,有利于沒有實際設備情況下的串口調試。
posted on 2009-04-17 19:15
春秋十二月 閱讀(4473)
評論(0) 編輯 收藏 引用 所屬分類:
C/C++