首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

串口WriteFile的有关问题

2012-09-07 
串口WriteFile的问题到重启电脑后运行程序WriteFile返回值一直是0, 如果运行一次串口调试助手, 又会变成正

串口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;} 


[解决办法]

探讨
用同步方式能写进去 writeFile返回的值是1 但是写进去后没有效果

热点排行