15,471
社区成员
发帖
与我相关
我的任务
分享
//***************************************************************
// 全局变量
//***************************************************************
DWORD ThreadProcEvent(LPVOID pParam); // 事件响应函数(线程)
HANDLE hCom; // 串口的句柄
HANDLE hThreadEvent; // 事件线程句柄
bool fEventRun; // 事件函数执行标志
DWORD dwWinThreadID; // 窗口线程ID
DWORD dwThreadID; // 事件线程ID
OVERLAPPED Eol={0}; // 事件线程使用的结构
OVERLAPPED Wol={0}; // 写操作使用的结构
OVERLAPPED Rol={0}; // 读操作使用的结构
bool fStopMsg; // 停止事件线程向主线程发送消息标志
// ************ 串口事件响应程序 **************
DWORD ThreadProcEvent(LPVOID pParam)
{
DWORD dwEvtMask,dwRes;
Eol.hEvent=CreateEvent(NULL, // 设置为无信号状态
FALSE, // 自动复原
FALSE,
NULL);
while(fEventRun)
{
WaitCommEvent(hCom,
&dwEvtMask,
&Eol);
dwRes=WaitForSingleObject(Eol.hEvent,
TO_EVENT_TIMEOUT);
switch(dwRes)
{
case WAIT_OBJECT_0: // 得到监视结果
switch(dwEvtMask)
{
case EV_RXCHAR: // 接收到数据
if(!fStopMsg)
{
fStopMsg=true;
::PostThreadMessage(dwWinThreadID, // 向窗口线程发收到数据的消息
WM_COMMDATA_MESSAGE,
(WPARAM)EV_RXCHAR,1); // 发送接收缓冲区有数据事件消息
}
break;
case EV_TXEMPTY: // 发送缓冲区已空
// 发送缓冲区空
::PostThreadMessage(dwWinThreadID, // 向窗口线程发收到数据的消息
WM_COMMDATA_MESSAGE,
(WPARAM)EV_TXEMPTY,1); // 发送缓冲区已空事件消息
break;
}
break;
}
}
return true;
}
////////////////////////////////////// 全局END /////////////////////////////////////////
bool CCommThread::fEvent=false; // 初始化线程启动标志