串口 被阻塞
场景:串口通信程序为什么WriteFile被阻塞
串口通讯程序为什么WriteFile被阻塞?
环境:VS2008 MFC 单文档 Formview
问题:使用串口实现蓝牙通讯,现在能打开端口,并正常接收数据。现在的问题是要发送数据时程序阻塞在WriteFile这里,当再次接收到数据时WriteFile才完成,不知道这是为什么?
------解决方案--------------------
串口也有同步和异步,是不是设置的不对?
------解决方案--------------------
你把接收线程关了看看能不能发送数据,感觉能发送数据.如果确实是这样,你就看看是不是因为接收线程里的光设读取属性了,把发送属性给关了.你查下有没有发送属性,就象EV_RXCHAR这个属性,如果有,你把发送属性也设上.
你把这句:SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);改成这样试试:
SetCommMask(ps->m_hComm, EV_RXCHAR); //接收到数据时WriteFile才能继续
CTS和DSR不要了,会不会这是两个中的一个属性不让发了
串口通讯程序为什么WriteFile被阻塞?
环境:VS2008 MFC 单文档 Formview
问题:使用串口实现蓝牙通讯,现在能打开端口,并正常接收数据。现在的问题是要发送数据时程序阻塞在WriteFile这里,当再次接收到数据时WriteFile才完成,不知道这是为什么?
- C/C++ code
BOOL CSeriesPort::WritePort(HANDLE hc, const BYTE* buf, DWORD len) { DWORD wnum = 0; DWORD hnum = 0; //已写入了字节 ASSERT(hc != INVALID_HANDLE_VALUE); do { if(WriteFile(hc,buf + hnum,len - hnum, &wnum, NULL)) //阻塞在这里,单步执行也不行,直到接收到数据时才执行到下一步 { hnum = hnum + wnum; if(hnum == len) { break; } Sleep(10); } else { return FALSE; } } while (TRUE); return TRUE; } DWORD CSeriesPort::ReadThreadFunc(LPVOID lp) { CSeriesPort* ps = (CSeriesPort*)lp; DWORD evt; BYTE* rbuf = NULL; //读取的字节 DWORD rLen = 0; //实际读取的字节 DWORD wLen; DWORD rError; COMSTAT cmstate; ASSERT(ps->m_hComm != INVALID_HANDLE_VALUE); PurgeComm(ps->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR); //清空缓冲区 SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR); while(TRUE) { if(WaitCommEvent(ps->m_hComm, &evt, 0)) { SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR); //接收到数据时WriteFile才能继续 //串口收到字符 if(evt & EV_RXCHAR) { ClearCommError(ps->m_hComm, &rError, &cmstate); wLen = cmstate.cbInQue; if(wLen <= 0) { continue; } rbuf = new BYTE[wLen]; memset(rbuf, '\0', wLen); ReadFile(ps->m_hComm, rbuf, wLen, &rLen, 0); if(rLen > 0) //触发读事件 { ps->m_onSeriesRead(ps->m_owner, rbuf, rLen); } } } //收到读线程退出信号,退出线程 if(WaitForSingleObject(ps->m_readCloseEvent, 50) == WAIT_OBJECT_0) { break; } } return 0; }
------解决方案--------------------
串口也有同步和异步,是不是设置的不对?
------解决方案--------------------
你把接收线程关了看看能不能发送数据,感觉能发送数据.如果确实是这样,你就看看是不是因为接收线程里的光设读取属性了,把发送属性给关了.你查下有没有发送属性,就象EV_RXCHAR这个属性,如果有,你把发送属性也设上.
你把这句:SetCommMask(ps->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR);改成这样试试:
SetCommMask(ps->m_hComm, EV_RXCHAR); //接收到数据时WriteFile才能继续
CTS和DSR不要了,会不会这是两个中的一个属性不让发了