串口WriteFile的问题
到重启电脑后运行程序 WriteFile返回值一直是0, 如果运行一次串口调试助手, 又会变成正常的,能写进数据了,怎么一回事?
m_hCom = CreateFile( lpszPortNum, GENERIC_WRITE | GENERIC_READ, 0,
NULL, OPEN_EXISTING , FILE_FLAG_OVERLAPPED,NULL);
bSuccess = WriteFile( m_hCom, pdata, len, &writen, &m_ov );
随后用
bSuccess = GetOverlappedResult( m_hCom, &m_ov, &writen, TRUE );
written也能返回正确的值
错误时 重叠I/O操作
[解决办法]
“m_hCom = CreateFile”成功没有?
[解决办法]
创建文件之前执行打开串口的操作了吗?
[解决办法]
用完 Close没
[解决办法]
'重叠I/O操作在进行中'本不是错误。
[解决办法]
参考:
- C/C++ code
///////////////////////////////////////////////////////////int CDload::WriteCommBlock(BYTE *pBlock,int nBlockLen){ //return 0 if error DWORD dwBytesWritten; DWORD dwModemStat; int WaitErr; BOOL fWriteStat; if (!m_bConnected) return 0; dwBytesWritten=0; fWriteStat=WriteFile(m_idComDev,pBlock,nBlockLen,&dwBytesWritten,&m_osWrite); if(!fWriteStat) { // Writting wait if (GetLastError()==ERROR_IO_PENDING) { // if writting processing//??? ResetEvent(m_osWrite.hEvent);//??? if (WaitErr=WaitForSingleObject(m_osWrite.hEvent,60000)) // 1 minute { // WaitErr!=0 if(WaitErr==WAIT_TIMEOUT) { // time out KillTimer(1);// if device error! GetCommModemStatus(m_idComDev,&dwModemStat); if(dwModemStat &= MS_CTS_ON) // if (CTS_ON && TIME_OUT) then COMM Hardware Errors. { // 16 "GREEN" AfxMessageBox("COMM Device hardware errors.",MB_ICONSTOP);// don't move m_bLoadStop=1; dwBytesWritten=0; } else { // 0 "RED" AfxMessageBox("CTS timer 60 seconds out!",MB_ICONSTOP); m_bLoadStop=1; dwBytesWritten=0; } }// if(WaitErr==WAIT_FAILED) =-1// else other waiterr } else { // WaitErr=0.if you SetEvent(m_osWrite.hEvent) anywhere else GetOverlappedResult(m_idComDev,&m_osWrite,&dwBytesWritten,FALSE); m_osWrite.Offset +=dwBytesWritten; } }// else // not IO_PENDING } return (int)dwBytesWritten;}
[解决办法]
注意:
if (GetLastError()==ERROR_IO_PENDING)
[解决办法]
如果你使用的是重叠(异步)方式打开串口的话
出现这个错误很正常。表明I/O没有完成。但不表明串口操作有错误。
如果你使用同步方式打开串口的话,那就是有错误了。
因为同步方式是阻塞的,直到I/O完成才返回。
- C/C++ code
我的一段成功代码,供参考//工作者线程pParam为可传递的参数本程序传递的是对话框指针UINT CommProc(LPVOID pParam){ OVERLAPPED os; DWORD dwMask, dwTrans; DWORD m_TempErrorCode; COMSTAT ComStat; DWORD dwErrorFlags; CComiotestDlg *pDoc=(CComiotestDlg*)pParam; memset(&os,0,sizeof(OVERLAPPED)); os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL); if(os.hEvent==NULL) { AfxMessageBox("Can't create event object!"); return (UINT)-1; } while(pDoc->m_bConnect) { //通过清除COMM的错误获取通信状态主要是是否收到数据 ClearCommError(pDoc->hCom,&dwErrorFlags,&ComStat); if(ComStat.cbInQue==12) //是否收到数据 { // 无限等待WM_COMMNOTIFY消息被处理完 ::WaitForSingleObject(pDoc->m_hPostMsgEvent,INFINITE); //使pDoc->m_hPostMsgEvent消息为无信号的状态 ResetEvent(pDoc->m_hPostMsgEvent); // 通知窗口消息 PostMessage(pDoc->m_hTermWnd, WM_COMMNOTIFY, EV_RXCHAR, 0); continue; } dwMask=0; if(!WaitCommEvent(pDoc->hCom, &dwMask, &os)) // 重叠操作 { m_TempErrorCode=GetLastError(); if(m_TempErrorCode==ERROR_IO_PENDING) // 无限等待重叠操作结果 GetOverlappedResult(pDoc->hCom,&os,&dwTrans,TRUE); else { CloseHandle(os.hEvent); return (UINT)-1; } } } CloseHandle(os.hEvent); return 0;}
[解决办法]