資源簡介
利用API函數實現了串口通信功能,發送和接收可選擇字符格式,含有周期性發送功能,有興趣可以幫忙優化一下
代碼片段和文件信息
#include?“StdAfx.h“
#include?“SerialComm.h“
CSerialComm::CSerialComm(void)
{
m_recvData?=?““;
m_bConnected?=?FALSE;
m_pThread?=?NULL;
}
CSerialComm::~CSerialComm(void)
{
if(m_bConnected)?????????????//程序結束時刪除線程、關閉串口操作
closeConnection();
if(m_hPostMsgEvent)?????????//刪除事件句柄
CloseHandle(m_hPostMsgEvent);
if(m_osRead.hEvent)
CloseHandle(m_osRead.hEvent);
if(m_osWrite.hEvent)
CloseHandle(m_osWrite.hEvent);
}
BOOL?CSerialComm::openConnection(CString?commno?UINT8?baud?UINT8?datalen?UINT8?stopbit?UINT8?parity)
{
if((baud?>?COMM_BAUD_115200)?||?
???(datalen?>?COMM_DATA_LEN_8)?||?
???(stopbit?>?COMM_STOP_BIT_2)?||?
???(parity?>?COMM_SPACE_PARITY))
{
m_bConnected?=?FALSE;
AfxMessageBox(_T(“串口參數設置錯誤“));
return?FALSE;
}
m_hPostMsgEvent?=?CreateEvent(NULL?TRUE?TRUE?NULL);
if(m_hPostMsgEvent?==?NULL)
return?FALSE;
memset(&m_osRead?0?sizeof(OVERLAPPED));
memset(&m_osWrite?0?sizeof(OVERLAPPED));
m_osRead.hEvent?=?CreateEvent(NULL?TRUE?FALSE?NULL);??//為重疊讀創建事件對象,手工重置,初始化為無信號
if(m_osRead.hEvent?==?NULL)
return?FALSE;
m_osWrite.hEvent?=?CreateEvent(NULL?TRUE?FALSE?NULL);?//為重疊寫創建事件對象,手工重置,初始化為無信號
if(m_osWrite.hEvent?==?NULL)
return?FALSE;
m_hComm?=?CreateFile(commno?????????????????????????????//打開串口
?????????????????GENERIC_READ?|?GENERIC_WRITE???????//允許對設備進行讀寫訪問
?0??????????????????????????????????//獨占方式
?NULL???????????????????????????????//
?OPEN_EXISTING??????????????????????//打開而不是創建
?FILE_FLAG_OVERLAPPED???????????????//使用異步通信
?NULL);
if(m_hComm?==?(HANDLE)-1)
{
m_bConnected?=?FALSE;
AfxMessageBox(_T(“打開串口失敗“));
return?FALSE;
}?else
{
SetupComm(m_hComm?MAXBLOCK?MAXBLOCK);??????????????//輸入緩沖區和輸出緩沖區的大小都是1024
SetCommMask(m_hComm?EV_RXCHAR?|?EV_TXEMPTY?);???????//設置事件驅動的類型
COMMTIMEOUTS?TimeOuts;
TimeOuts.ReadIntervalTimeout?=?MAXDWORD;?????????????//時間間隔設為最大,設為0會導致ReadFile立即返回并完成操作
TimeOuts.ReadTotalTimeoutMultiplier?=?0;
TimeOuts.ReadTotalTimeoutConstant?=?0;
TimeOuts.WriteTotalTimeoutMultiplier?=?50;???????????//設置寫超時用于GetOverlapperResult函數的等待時間
TimeOuts.WriteTotalTimeoutConstant?=?2000;
SetCommTimeouts(m_hComm?&TimeOuts);?????????????????//設置超時
//PurgeComm(m_hComm?PURGE_TXABORT?|?PURGE_RXABORT?|?PURGE_TXCLEAR?|?PURGE_RXCLEAR?);?//清干凈輸入、輸出緩沖區
if(!configureConnection(commno?baud?datalen?stopbit?parity))
{
CloseHandle(m_hComm);
return?FALSE;
}
return?TRUE;
}
}
BOOL?CSerialComm::configureConnection(CString?commno?UINT8?baud?UINT8?datalen?UINT8?stopbit?UINT8?parity)
{
DCB?dcb;
if(!GetCommState(m_hComm?&dcb))???????????//讀串口原來的參數設置
return?false;
switch(baud)???????????????????????????????//波特率
{
case?COMM_BAUD_2400:
dcb.BaudRate?=?2400;
break;
case?COMM_BAUD_4800:
dcb.BaudRate?=?4800;
break;
case?COMM_BAUD_9600:
dcb.BaudRate?=?9600;
break;
case?COMM_BAUD
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????3165??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\ReadMe.txt
?????文件??????67777??2009-08-31?02:31??API_SerialComm\YDVS_SerialComm\res\icon1.ico
?????文件??????67777??2009-08-31?02:31??API_SerialComm\YDVS_SerialComm\res\YDVS_SerialComm.ico
?????文件????????686??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\res\YDVS_SerialComm.rc2
?????文件???????3306??2013-12-24?12:01??API_SerialComm\YDVS_SerialComm\resource.h
?????文件???????8224??2013-12-20?17:50??API_SerialComm\YDVS_SerialComm\SerialComm.cpp
?????文件???????1671??2013-12-20?17:48??API_SerialComm\YDVS_SerialComm\SerialComm.h
?????文件????????148??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\stdafx.cpp
?????文件???????1636??2013-12-11?19:20??API_SerialComm\YDVS_SerialComm\stdafx.h
?????文件????????234??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\targetver.h
?????文件??????41056??2013-12-24?12:01??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.aps
?????文件???????2110??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.cpp
?????文件????????496??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.h
?????文件???????1481??2013-12-20?13:50??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.idc
?????文件??????15336??2013-12-24?12:01??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.rc
?????文件???????6119??2013-12-24?12:01??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.vcxproj
?????文件???????2316??2013-12-24?12:01??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.vcxproj.filters
?????文件????????143??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm\YDVS_SerialComm.vcxproj.user
?????文件??????12834??2014-01-19?16:18??API_SerialComm\YDVS_SerialComm\YDVS_SerialCommDlg.cpp
?????文件???????1754??2013-12-24?11:31??API_SerialComm\YDVS_SerialComm\YDVS_SerialCommDlg.h
?????文件???58544128??2014-01-19?16:20??API_SerialComm\YDVS_SerialComm.sdf
?????文件????????912??2013-12-11?19:13??API_SerialComm\YDVS_SerialComm.sln
????..A..H.?????22528??2014-01-19?16:20??API_SerialComm\YDVS_SerialComm.suo
?????目錄??????????0??2014-01-19?16:16??API_SerialComm\ipch\ydvs_serialcomm-65adb533
?????目錄??????????0??2014-01-19?16:21??API_SerialComm\YDVS_SerialComm\Debug
?????目錄??????????0??2014-01-19?16:15??API_SerialComm\YDVS_SerialComm\res
?????目錄??????????0??2014-01-19?16:20??API_SerialComm\Debug
?????目錄??????????0??2014-01-19?16:16??API_SerialComm\ipch
?????目錄??????????0??2014-01-19?16:15??API_SerialComm\YDVS_SerialComm
?????目錄??????????0??2014-01-19?16:20??API_SerialComm
............此處省略3個文件信息
評論
共有 條評論