串口通信程序为什么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) //触发读事件
{
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯