我想编一个串口程序程序开始我先开一个线程,在线程里用WaitCommEvent()等待串口事件的发生代码如下:
UINT CommProc(LPVOID pParam)
{
CUartDlg *pDlg = (CUartDlg *)pParam; DWORD dwMask = 0;
OVERLAPPED os;
os.hEvent = CreateEvent(NULL, TRUE,FALSE,NULL);
SetCommMask(pDlg->hCom,EV_CTS|EV_DSR|EV_RING|EV_RLSD|EV_RXCHAR|EV_TXEMPTY);
SetCommMask(pDlg->hCom, EV_CTS); while (true)
{
if (WaitCommEvent(pDlg->hCom, &dwMask, &os))
{
if (dwMask & EV_CTS) //CTS变化
{}
if (dwMask & EV_DSR) //DSR变化
{}
if (dwMask & EV_RING) //ring信号变化
{}
if (dwMask & EV_RLSD) //CD信号变化
{}
if (dwMask & EV_RXCHAR) //输入缓冲区收到新字符
{}
if (dwMask & EV_TXEMPTY) //发送缓冲区空
{}
}
else//出错处理
{
dwError = GetLastError();
if( dwError == ERROR_IO_PENDING)
{
//程序总是跳到这里
}
}
}
return 0;
}可是不知道为什么,只要程序一运行,我没有作任何串口操作,WaitCommEvent()就会返回false,不知为什么串口使用重叠方式打开的
hCom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
UINT CommProc(LPVOID pParam)
{
CUartDlg *pDlg = (CUartDlg *)pParam; DWORD dwMask = 0;
OVERLAPPED os;
os.hEvent = CreateEvent(NULL, TRUE,FALSE,NULL);
SetCommMask(pDlg->hCom,EV_CTS|EV_DSR|EV_RING|EV_RLSD|EV_RXCHAR|EV_TXEMPTY);
SetCommMask(pDlg->hCom, EV_CTS); while (true)
{
if (WaitCommEvent(pDlg->hCom, &dwMask, &os))
{
if (dwMask & EV_CTS) //CTS变化
{}
if (dwMask & EV_DSR) //DSR变化
{}
if (dwMask & EV_RING) //ring信号变化
{}
if (dwMask & EV_RLSD) //CD信号变化
{}
if (dwMask & EV_RXCHAR) //输入缓冲区收到新字符
{}
if (dwMask & EV_TXEMPTY) //发送缓冲区空
{}
}
else//出错处理
{
dwError = GetLastError();
if( dwError == ERROR_IO_PENDING)
{
//程序总是跳到这里
}
}
}
return 0;
}可是不知道为什么,只要程序一运行,我没有作任何串口操作,WaitCommEvent()就会返回false,不知为什么串口使用重叠方式打开的
hCom = CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL);
解决方案 »
- 编写记事本
- 关于 Default Button 属性和 IDOK
- MFC里的控件如何响应中键事件?(举个例子)
- win7下如何用管理员权限执行某程序?
- vc调用java程序时改变输入法的问题
- 请教:各位大哥 服务器怎么监视客户端桌面(某个区域)的情况?谢谢!
- 在数据库管理方面我认为C++比JAVA强,那JAVA在服务器上对数据库管理有优势吗?
- ftp客户端编程疑问!!(初学网络编程--在线等)
- 怎么样设置两个猫互拨啊!急!
- 取得当前窗口聚集控件的ID值,GetDlgCtrlID(hwndctl)中的hwndctl该怎么用?
- 组合键小问题
- MFC下如何获得本机MAC地址,为什么在mfc下找不到NCB结构啊!!需要什么支持??
SetCommMask(pDlg->hCom, EV_CTS);
????????????????????????????????????????????????
SetCommMask(pDlg->hCom,EV_CTS|EV_DSR|EV_RING|EV_RLSD|EV_RXCHAR|EV_TXEMPTY);
//SetCommMask(pDlg->hCom, EV_CTS); 这一句我后来注释掉了,我想让程序等待串口的多个事件,但不知为什么WaitCommEvent(pDlg->hCom, &dwMask, &os)总是出错返回?
{
// Handle the error.
printf("SetCommMask failed with error %d.\n", GetLastError());
return;
} // Create an event object for use by WaitCommEvent. o.hEvent = CreateEvent(
NULL, // default security attributes
FALSE, // auto reset event
FALSE, // not signaled
NULL // no name
);
// Intialize the rest of the OVERLAPPED structure to zero.
o.Internal = 0;
o.InternalHigh = 0;
o.Offset = 0;
o.OffsetHigh = 0; assert(o.hEvent); if (WaitCommEvent(hCom, &dwEvtMask, &o))
{
if (dwEvtMask & EV_DSR)
{
// To do.
} if (dwEvtMask & EV_CTS)
{
// To do.
}
}
else
{
DWORD dwRet = GetLastError();
if( ERROR_IO_PENDING == dwRet)
{
printf("I/O is pending...\n"); // To do.
}
else
printf("Wait failed with error %d.\n", GetLastError());
}
}