|
引用 4 楼 flandy1982 的回复:
引用 3 楼 aleon_liao 的回复:
引用 1 楼 flandy1982 的回复:
定时器好像没有优先级的说法.
建议使用开线程来处理串口数据.
FLandY1982兄!非常感谢您的回复!我很多问题都得到您宝贵的建议!
我本来是用开线程开接收数据的,但是那串口端的发送频率太高,每一毫秒就有数据发生过来,所以要是我接收端在检测到有数据发生过来后就开启线程读取数据的话,机子就好像卡住了。所以我才用定时器定时接收缓冲中的数据的。
现在的问题是,普通定时器的不能修改优先级,在我点击其它按钮的时候,系统就执行其它任务了,从而使缓冲区满,引起数据丢失。其实其它操作是可以不用及时得到执行的。
不知道有什么方法可以解决这种问题?
不要实用同步操作,否则在有串口数据时, 接收线程会一直占用CPU,你的主线程就一直没有响应了。
使用异步操作。类似如下代码段:
C/C++ codeif(!ReadFile(m_hDev,&bReadTemp,1,&dwReadSize,&overlapped)) {if(GetLastError()== ERROR_IO_PENDING) {
DWORD dwRet= WaitForSingleObject(overlapped.hEvent, INFINITE);
m_eventRead.ResetEvent();switch(dwRet) {case WAIT_OBJECT_0:if(m_bCloseReq) {
CancelIo(m_hDev);
}else {
bRead= GetOverlappedResult(m_hDev,&overlapped,&dwReadSize, TRUE);
}break;case WAIT_TIMEOUT:
TRACE(_T("Read Uart timeout."));
CancelIo(m_hDev);break;
}
}else {
bRead= FALSE;
}
}
你可以看MSDN或者网上搜搜相关的技术文章看看。
个人意见仅供参考。
FLandY
FLandY 你好!
我本来是用汪兵 那本书上用的方法,通过创建单独线程模拟重叠操作的方法,但是效果不好。我才用定时器的。暂时想不出更好的办法了。只能在接收数据的时候把其它按钮给屏蔽掉,等数据接收到需要的长度时,再使能其它按钮了!
没办法,只能暂时用这种笨方法了!
不过还是多谢各位大侠的无私指教! |
|