社区
进程/线程/DLL
帖子详情
请教关于串口通信中读串口的问题
weihao2008
2008-10-16 04:06:37
现在有一个串口通信的系统,用的是同步处理,现在的系统是用一个子线程不停地读
串口,读到数据就分析。这样的话,当串口中没有数据的时候,这个子线程也还在不停地读
串口,这样就占用了很多cpu时间,我想问一下有没有什么办法,可以在串口收到数据时,读串口
,没有数据的时候 就不读?
...全文
248
25
打赏
收藏
请教关于串口通信中读串口的问题
现在有一个串口通信的系统,用的是同步处理,现在的系统是用一个子线程不停地读 串口,读到数据就分析。这样的话,当串口中没有数据的时候,这个子线程也还在不停地读 串口,这样就占用了很多cpu时间,我想问一下有没有什么办法,可以在串口收到数据时,读串口 ,没有数据的时候 就不读?
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
25 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
weihao2008
2008-10-20
打赏
举报
回复
我这里用的就是ReadFile,看来用同步处理来解决这个问题比较困难了。
weihao2008
2008-10-17
打赏
举报
回复
谢谢楼上的回复,不过如果为发送过程也开一个子线程的话,是不是这个线程要不断查询发送信号(这里假设有一个发送标志位,当有数据要发送的时候,该标志位为1),直到有数据可以发送的时候该线程再发送数据,这样的话,还是要浪费CPU的时间的,我现在的目的是,在没有数据发送和接受的时候,尽量减少cpu的利用率,网上有有关用异步处理方法来解决这个问题的例子,但我现在用的框架是同步处理的,所以我想尽量还用同步处理来解决这个问题,不知道有没有什么好的办法?
Joephia
2008-10-17
打赏
举报
回复
[Quote=引用楼主 weihao2008 的帖子:]
现在有一个串口通信的系统,用的是同步处理,现在的系统是用一个子线程不停地读
串口,读到数据就分析。这样的话,当串口中没有数据的时候,这个子线程也还在不停地读
串口,这样就占用了很多cpu时间,我想问一下有没有什么办法,可以在串口收到数据时,读串口
,没有数据的时候 就不读?
[/Quote]
请问怎么读的?
如果用ReadFile(handle,....)则应该是阻塞的,
没有内容会停在那里,所以放在子线程里很合适的
dawei_sun
2008-10-17
打赏
举报
回复
If hFile was not opened with FILE_FLAG_OVERLAPPED, WaitCommEvent does not return until one of the specified events or an error occurs.
上面是MSDN上的原话.也就是说只要文件(这里面串口)不是以FILE_FLAG_OVERLAPPED打开. WaitCommEvent只会在等到特定的事件后才会返回,不管其最后一个参数是NULL还是给的一个OVERLAPPED的结构变量.
weihao2008
2008-10-17
打赏
举报
回复
我试了一下,好像还是老毛病。
weihao2008
2008-10-17
打赏
举报
回复
[Quote=引用 20 楼 gotooker 的回复:]
WaitCommEvent(m_hComm, &dwMask, NULL))
和
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
是一样的效果的,但第二种方法解决了你的问题
[/Quote]
谢谢 我用这个试一下。
gotooker
2008-10-17
打赏
举报
回复
WaitCommEvent(m_hComm, &dwMask, NULL))
和
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
是一样的效果的,但第二种方法解决了你的问题
gotooker
2008-10-17
打赏
举报
回复
WaitCommEvent(m_hComm, &dwMask, NULL))
和
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
是一样的效果的,但第二种方法解决了你的问题
gotooker
2008-10-17
打赏
举报
回复
WaitCommEvent(m_hComm, &dwMask, NULL))
和
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
是一样的效果的,但第二种方法解决了你的问题
dawei_sun
2008-10-17
打赏
举报
回复
回14楼.LZ是在同步的环境中.OVERLAPPED结构是用于异步的.
回15楼.线程挂起但是WaitCommEvent并没有返回.所以WriteFile一样会卡在那边.我已经编程测试过了.
weihao2008
2008-10-17
打赏
举报
回复
[Quote=引用 14 楼 gotooker 的回复:]
建立overlapped 结构监听数据到来事件。
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
这样就会堵塞在WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
里,而不会影响你写入了。
[/Quote]
overlapped 结构不是用在异步处理中么,我现在用的是同步处理。
andywei1982
2008-10-17
打赏
举报
回复
事件。当串口有数据的时候激活,其他时间挂起
gotooker
2008-10-17
打赏
举报
回复
建立overlapped 结构监听数据到来事件。
WaitCommEvent(m_hComm, &dwMask, &m_ReadOverlapped))
WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
这样就会堵塞在WaitForSingleObject(m_ReadOverlapped.hEvent, dwWait);
里,而不会影响你写入了。
xiasongchuan
2008-10-17
打赏
举报
回复
热切关注中
dawei_sun
2008-10-17
打赏
举报
回复
我试了一下.确实存在你说的情况.我们平时都是用异步处理的.同步的情况可能串口同一时间只能处理一个事务.由于WaitCommEvent一直处于等待没有结束,所以WriteFile也处于等待状态而卡死.我试了一下将读取的线程悬挂起来也还是不行.只有结束线程可以使WriteFile得到返回.你可以考虑在写串口前将读线程结束,等WriteFile返回成功再重新创建读线程.目前我也没有想到别的好办法.欢迎一起研究.
weihao2008
2008-10-17
打赏
举报
回复
我跟踪了,如果WaitCommEvent在等待的时候,写串口,就会卡在WriteFile函数调用的地方。
我的操作系统是windowsxp,
dawei_sun
2008-10-17
打赏
举报
回复
WaitCommEvent仅仅是等待一个事件的发生.应该不会占用串口的.
dawei_sun
2008-10-17
打赏
举报
回复
不过我觉得即使不开线程也不应该有问题才对.因为RS232是双工通信.也就是说可以同时收发的.不开一个线程也是应该可以正确发送的我觉得.你有没有跟踪一下看看程序是卡在了什么地方?
dawei_sun
2008-10-16
打赏
举报
回复
[Quote=引用 6 楼 weihao2008 的回复:]
引用 5 楼 vcPlayer 的回复:
多线程!开一个线程来监控。
我现在是专门开了一个线程来检视,可能是因为WaitCommEvent占用着接口,一到往接口里写数据的时候,就会死掉。
[/Quote]
因为串口是独占的.可能你的串口一直处于ERROR_IO_PENDING状态.也就是一直处于读取状态.当你调用WriteFile在同步的模式情况下
它是先将要发送的字符串交给串口的缓冲区,这时该函数并不会返回直到串口真正把内容发送出去才会返回.所以你的程序就会卡在这边.
所以你可以考虑为发送过程也开一个子线程.
weihao2008
2008-10-16
打赏
举报
回复
[Quote=引用 5 楼 vcPlayer 的回复:]
多线程!开一个线程来监控。
[/Quote]
我现在是专门开了一个线程来检视,可能是因为WaitCommEvent占用着接口,一到往接口里写数据的时候,就会死掉。
加载更多回复(5)
键盘、数码管及
串口
间的通信实验报告.docx
实验报告的标题为“键盘、数码管及
串口
间的通信实验报告”,标签涉及“网络”和“cs”,意味...综上所述,这个实验旨在提升学生对微处理器接口技术、串行通信和中断机制的理解,并通过实际操作提高编程和
问题
解决能力。
C#
串口
转Socket带原码
VS2005
串口
转Socket通信带调试功能。通信帧按照电力规约进行封装。对上位机通信调试大有帮助.带源码。有
问题
随时
请教
:QQ 376033812 Email:xiaoligeng@126.com
基于FPGA的五子棋算法
【基于 FPGA 的五子棋算法】是一种将计算机博弈策略...在实践中,通过查阅资料、合作和
请教
老师,加深了对 Verilog 语言的理解,熟练掌握了工程软件的使用。实践证明,理论知识只有在实际应用中才能真正被理解和掌握。
《单片机基础》练习题及答案(推荐文档).doc
实践操作部分则可能涉及到编写汇编语言程序或C语言程序,以控制单片机完成特定任务,例如LED灯的闪烁、温度测量、
串口
通信
等。 在解答练习题的过程中,学习者不仅可以检验自己的理解程度,还能提高解决
问题
的能力。...
webservice
- **开发规则**:设定明确的工作时间和行为规范,如规定编程期间禁止无关活动,鼓励团队协作,遇到
问题
及时讨论和
请教
。 - **分工**:根据团队成员的专长进行任务分配,重点在于服务系统的技术挑战和客户端的细节...
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章