高人们,请帮帮小弟 本人用VC2005做串口编程,采用的是WIN32 API事件驱动方式,事件线程中WAITCOMMEVENT()函数通过了,却在WAITFORSINGLEOBJECT()函数这里卡住了,我想可能发生了ERRO_IO_PENDING 错误,但是我没有读写数据啊,怎么就发生这种错误了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 程序在WaitCommEvent就以失败,导致waitforsingleobject等不到WAIT_OBJECT_0,用GetLastError()得到IO_ERROR_PENDING//处理打开串口事件void CDataAcquisitionView::OnOpencom(){ CString strDis; hCom = CreateFile(myCom,GENERIC_READ|GENERIC_WRITE, 0,NULL,OPEN_EXISTING, FILE_FLAG_OVERLAPPED, NULL); if(hCom != INVALID_HANDLE_VALUE) { SetupComm(hCom,1024,512); //设置串口输入缓冲区及输出缓冲区大小 DCB myDCB; //DCB是一种数据结构,串口通信中,使用该数据结构存放通信参数 GetCommState(hCom,&myDCB); //获取当前串口通信参数的的设置值 myDCB.BaudRate = comBaudRate; myDCB.fBinary = true; myDCB.fParity = comfParity; myDCB.ByteSize =8; myDCB.Parity = comParity; myDCB.StopBits =(BYTE) ONESTOPBIT; SetCommState(hCom,&myDCB); //设置串行通信参数 AfxMessageBox(_T("串口打开成功!")); blnOpened = true; } else { AfxMessageBox(_T("串口打开失败!当前串口被占用,或其他错误")); blnOpened = false; } hWnd = GetSafeHwnd(); //得到当前窗口句柄 DWORD dwParam; if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)) //设置允许的事件类型 { AfxMessageBox(_T("建立事件掩码失败!")); } hThreadEvent = CreateThread(NULL,0, (LPTHREAD_START_ROUTINE)ThreadProcEvent, &dwParam,0,&dwThreadID); if(hThreadEvent == INVALID_HANDLE_VALUE) { AfxMessageBox(_T("事件线程创建失败!")); } hEventRun =true; }///////////////////////DWORD ThreadProcEvent(LPVOID pParam){ DWORD dwEvtMask,dwRes; Eol.hEvent = CreateEvent(NULL,TRUE, //设置Eol.hEvent成员为无信号状态 FALSE,NULL); while(hEventRun) { WaitCommEvent(hCom,&dwEvtMask, //监视串口事件 &Eol); dwRes = WaitForSingleObject(Eol.hEvent, //等待信号 1000); switch(dwRes) { case WAIT_OBJECT_0: //成功得到事件监视结果 switch(dwEvtMask) { case EV_RXCHAR: //接收到数据 if(!fStopMsg) { fStopMsg = true; ::PostMessage(hWnd,WM_MYMSG, //向主线程发送消息,接收到数据 0,(LPARAM)EV_RXCHAR); } break; case EV_TXEMPTY: AfxMessageBox(_T("send buffer is empty")); break; } } break; }return true;} GetLastError()得到IO_ERROR_PENDING //这个不是表示串口操作没有完成吗?这时串口还在读入数据或者写出数据 补充一下,我是采用事件驱动方式监控串口事件的,而且我在事件线程中就没有读写数据,怎么就发生ERROR_IO_PENDING了呢,用串口调试助手是可以和单片机的 WaitForMultipleObjects问题 求助:关于求点的坐标问题 如何清除CHtmlView中载入页面的缓存 请教:通过odbc链接access数据库源并实时存储数据并随时提供调用的问题。 请问:使用VPN在广域网上联接的两个局域网之间,能不能用UDP协议通讯? 那里下载greta? 一个关于数据库的问题,请指点,急!!! 指向类的指针 如何得到绘图句柄? 如何实现c#利用openFileDialog添加图片时,添加图片时会自动复制图片到指定的目录下(如C:\) [急!!!!]怎么向窗口发送ON_EN_UPDATE 消息?? MFC CTreeCtrl问题
//处理打开串口事件
void CDataAcquisitionView::OnOpencom()
{
CString strDis;
hCom = CreateFile(myCom,GENERIC_READ|GENERIC_WRITE,
0,NULL,OPEN_EXISTING,
FILE_FLAG_OVERLAPPED,
NULL);
if(hCom != INVALID_HANDLE_VALUE)
{
SetupComm(hCom,1024,512); //设置串口输入缓冲区及输出缓冲区大小
DCB myDCB; //DCB是一种数据结构,串口通信中,使用该数据结构存放通信参数
GetCommState(hCom,&myDCB); //获取当前串口通信参数的的设置值
myDCB.BaudRate = comBaudRate;
myDCB.fBinary = true;
myDCB.fParity = comfParity;
myDCB.ByteSize =8;
myDCB.Parity = comParity;
myDCB.StopBits =(BYTE) ONESTOPBIT;
SetCommState(hCom,&myDCB); //设置串行通信参数
AfxMessageBox(_T("串口打开成功!"));
blnOpened = true;
}
else
{
AfxMessageBox(_T("串口打开失败!当前串口被占用,或其他错误"));
blnOpened = false;
}
hWnd = GetSafeHwnd(); //得到当前窗口句柄
DWORD dwParam;
if(!SetCommMask(hCom,EV_RXCHAR|EV_TXEMPTY)) //设置允许的事件类型
{
AfxMessageBox(_T("建立事件掩码失败!"));
}
hThreadEvent = CreateThread(NULL,0,
(LPTHREAD_START_ROUTINE)ThreadProcEvent,
&dwParam,0,&dwThreadID);
if(hThreadEvent == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("事件线程创建失败!"));
}
hEventRun =true;
}
///////////////////////
DWORD ThreadProcEvent(LPVOID pParam)
{
DWORD dwEvtMask,dwRes;
Eol.hEvent = CreateEvent(NULL,TRUE, //设置Eol.hEvent成员为无信号状态
FALSE,NULL);
while(hEventRun)
{
WaitCommEvent(hCom,&dwEvtMask, //监视串口事件
&Eol);
dwRes = WaitForSingleObject(Eol.hEvent, //等待信号
1000);
switch(dwRes)
{
case WAIT_OBJECT_0: //成功得到事件监视结果
switch(dwEvtMask)
{
case EV_RXCHAR: //接收到数据
if(!fStopMsg)
{
fStopMsg = true;
::PostMessage(hWnd,WM_MYMSG, //向主线程发送消息,接收到数据
0,(LPARAM)EV_RXCHAR);
}
break;
case EV_TXEMPTY:
AfxMessageBox(_T("send buffer is empty"));
break;
}
}
break;
}
return true;
}
//这个不是表示串口操作没有完成吗?这时串口还在读入数据或者写出数据