?

免費教程_免費網賺教程_破解版軟件-寂涯網絡學習基地

當前位置: 主頁 > 系統綜合 > 各類編程 > VC下利用WindowsAPI異步串口通信軟件設計

VC下利用WindowsAPI異步串口通信軟件設計

時間:2012-06-16 19:04來源:未知 整理:寂涯網絡 點擊:

引言
在現代工業監測和控制領域中,正確對前端設備進行
監控在整個生產過程中起著十分重要的作用 本研究在
VC++環境下,采用WindowsAPI函數研究開發了現場溫
度實時監控系統,通過RS485接口在上位機端完成溫度控
制器現場數據的實時采集,同時將采集到的數據存儲在
Excel中,以方便查詢和后續處理
利用WindowsAPI異步串口通信軟件
1 串口通信模塊
串口通信作為計算機與外部設備之間常用的通信方
法之一,在工業控制領域 數據采集和實時監控系統中得
到廣泛應用 目前,在Windows環境下實現串行通信主要
有以下兩種方式: (1)采用MSComm串行通信控件 這種方
法在編程時非常方便,其優點在于使用者不必花費大量時
間去了解復雜的 API函數,但控件占用的資源多,靈活性
差; (2)調用WindowsAPI函數 由于 API函數具有比較強
的通信功能,可以與多線程技術和自定義消息機制的異步
串口通信相結合,能提高串口通信的效率和程序的靈活
性 所以,本系統采用API函數編寫串口通信程序,需要建
立串口通信類CCommPort,在主對話框中調用類的對象來
完成數據的接收處理和存儲任務
1.1 打開串口
Win32系統使用CreateFile()函數來打開串口 打開
串口的通信方式有兩種:一種是同步方式;另一種是異
步方式 在同步方式下, API函數會阻塞直到操作完成
后才能返回;而在異步方式下, API函數會立即返回,操
作在后臺進行,避免線程阻塞,故采用異步方式打開
為了使用異步I/O方式打開串口,在打開串口時,必須
指定文件的屬性為FILE_FLAG_OVERLAPPED[1]

HANDLEm_hComm; //定義端口句柄
m_hComm=CreateFile("Coml", GENERIC_READ|
GENERIC_WRITE, 0, NULL, OPEN_EXISTING,FILE_
ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
NULL);
if(m_hComm==INVALID_HANDLE_VALUE||
m_hComm==NULL)
{
m_hComm=NULL;
returnFALSE;
}
return TRUE;
2 配置串口
在打開通訊設備句柄后,常需要對串口進行一些初
始化配置工作 這需要通過一個DCB結構來進行 DCB
結構包含了諸如波特率 數據位數 奇偶校驗和停止位數
等信息 一般用CreateFile打開串口后,可以調用Get-
CommState(m_hComm, &dcb)讀取當前串口設備控制塊
DCB設置,要修改串口的配置,應該首先修改DCB結構,
然后再通過SetCommState(m_hComm, &dcb)將其寫入[2]
在用ReadFile和WriteFile函數讀寫串口時,需要考
慮超時問題 進行異步讀寫超時控制設置時,通過
COMMMTIMEOUTS結構設置超時,再用 SetCommTime-
outs(m_hComm, &stComTimeOuts)將結果寫入 本程序中
對COMMMTIMEOUTS配置的代碼如下:
COMMTIMEOUTSstComTimeOuts;
stComTimeOuts.ReadIntervalTimeout=0;
stComTimeOuts.ReadTotalTimeoutMultiplier=0;
stComTimeOuts.ReadTotalTimeoutConstant=20;
stComTimeOuts.WriteTotalTimeoutMultiplier=0;
stComTimeOuts.WriteTotalTimeoutConstant=20;
SetCommTimeouts(m_hComm,&stComTimeOuts);
1.3 讀寫串口
本程序采用ReadFile()函數和WriteFile()函數讀寫串
口值,如果操作成功,這兩個函數都返回TRUE 需要注
意的是,當 ReadFile和 WriteFile的返回值為 FALSE 時,
不一定就是操作失敗,線程應該調用 GetLastError()函數
分析返回的結果 例如,在異步I/O方式時如果操作還未
完成函數就返回,那么函數就返回 FALSE,而且當 Get-
LastError 函數返回 ERROR_IO_PENDING,這說明讀寫
操作還未完成,即操作轉入后臺繼續運行[2]
有兩種方法
可以等待操作完成:一種方法是用 WaitForSingleObject
等待函數來等待 OVERLAPPED結構的 hEvent成員;另
一種方法是調用GetOverlappedResult函數等待 主要代
碼如下:
charlpInBuffer[1024];
DWORDdwBytesRead=1024;
B0OLbReadStat;
OVERLAPPEDm_osRead;
bReadStat=ReadFile(m_hComm, lpInBuffer, dwBytes-
Read, &dwBytesRead, &m_osRead);
if(!bReadStat)//如果ReadFile函數返回FALSE
{
if(GetLastError()==ERROR_IO_PENDING)
{
GetOverlappedResult(m_hComm,&m_osRead,&dw-
BytesRead,TRUE);//GetOverlappedResult函數的最后一個
參數設為TRUE,函數會一直等待,直到讀操作完成或由
于錯誤而返回
return((int)dwBytesRead);
}

本頁地址 http://www.ionrce.tw/biancheng/20120616953.html

百度搜索更多

谷歌搜索更多

頂一下
(1)
50%
踩一下
(1)
50%
------分隔線----------------------------
?
評價:
昵稱: 驗證碼:點擊我更換圖片
推薦內容
贊助商
贊助商
?

關于本站免責聲明視頻更新google百度地圖視頻地圖RRS訂閱

如有什么問題請在本站留言,或發郵件到 hxt167#foxmail.com

内蒙古十一选五基本走势图手机版