永发信息网

串口通信程序为什么WriteFile被阻塞

答案:2  悬赏:70  手机版
解决时间 2021-01-27 02:39
  • 提问者网友:疯子也有疯子的情调
  • 2021-01-26 06:58
串口通信程序为什么WriteFile被阻塞
最佳答案
  • 五星知识达人网友:西岸风
  • 2021-01-26 08:37
:异步串口可以不用,同步阻塞方式必须用,否则调用readfile writefile会阻塞线程,窗口就卡死了。。。 单线程用异步串口可以,但并不好,异步方式,窗口界面一般你还需要用个定时器,定时来查询通讯是否完成,何必这么麻烦,实时性又差
全部回答
  • 1楼网友:長槍戰八方
  • 2021-01-26 09:14
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) //触发读事件 {
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯