楼主你好,我也在用cserialport类串口通讯,我的只要实现发送功能就可以,但是要求是25ms,请问这个类能达到么?
哎哟 ,还在考虑系统的事情啊! 肯定是自己代码的问题,别想太多了。 老老实实的把代码缕一缕,肯定能找到问题的,
SetTimer更不精准。用SetTimer计时,操作系统内部反复地使用的GetTickCount获取当前时间,再与上次插入WM_TIMER的时间做差值比较,要是大于等于SetTimer的时间间隔,就插入一个WM_TIMER到消息队列。更恶心的是如果插入WM_TIMER时发现消息队列还有先前的WM_TIMER没处理完,先前的WM_TIMER就会被操作系统移除。 GetTickCount的精度也就15MS(事实上还不如多媒体),再加上偶有被移除的WM_TIMER,SetTimer的精度能到30MS就不错了。
“所以串口发送和接收不能同时进行” 没叫你 同时,是叫你 开个 发送线程, 提高优先度,sleep 定时。 能不能发送 ( 有没有在接受) 通过 event 控制。
你的代码我们都没有看见过,其中到底什么地方写的不合理,我们无从知道,大家也都是凭借经验猜测而已,你如此询问有什么实际意义呢?学习也是要讲究技巧的,太过于纠结于某个问题,难道不是在浪费时间吗?哪怕别人的一句话就能让你拨开云雾见晴天!
多媒体定时器timeSetEvent()函数,定时精度为ms级。 对于精确度要求更高的定时操作,可以试试QueryPerformanceFrequency() 和 QueryPerformanceCounter()函数。
"开辟的串口线程既要发送又要接收" 不能分成 2个 线程 ? 为什么 ?
"试了下提升线程权限,好像没用" 操作系统 按 线程 调度 (不是 进程), 定时器在 主线程 , 而主线程是 不能 提升线程 优先度。 只能在 发送 线程 中 提升线程 优先度,Sleep(200), 是 代替 定时器, 用来 定时的。
BOOL CSerialPort::StartMonitoring() { if (!(m_Thread = AfxBeginThread(CommThread, this))) return FALSE; m_Thread->SetThreadPriority(THREAD_PRIORITY_TIME_CRITICAL); TRACE("Thread started\n"); return TRUE; }
"两个线程的话比较麻烦" 怕麻烦, 就没办法 了
连续第三次回复了,把前面各位兄弟给我的建议都一一回复了。 [quote=引用 43 楼 asdjy123 的回复:] 在接收完一帧报文立即使用:PurgeComm(mycom.m_hComm, PURGE_RXCLEAR);//清空接收缓冲区, 我就是这么干的
代码写的有问题,就别再纠结了,找个高人给你看看代码!
多媒体定时,理论上精度是1MS,实际上操作系统忙不过来的,它要考虑硬件IO、消息循环、线程池。一般配置的机器精度到15MS就是极限了。
在接收完一帧报文立即使用:PurgeComm(mycom.m_hComm, PURGE_RXCLEAR);//清空接收缓冲区, 我就是这么干的
2,644
社区成员
17,232
社区内容
加载中
试试用AI创作助手写篇文章吧