社区
进程/线程/DLL
帖子详情
请教关于串口通信中读串口的问题
weihao2008
2008-10-16 04:06:37
现在有一个串口通信的系统,用的是同步处理,现在的系统是用一个子线程不停地读
串口,读到数据就分析。这样的话,当串口中没有数据的时候,这个子线程也还在不停地读
串口,这样就占用了很多cpu时间,我想问一下有没有什么办法,可以在串口收到数据时,读串口
,没有数据的时候 就不读?
...全文
241
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
。。。
C#
串口
转Socket带原码
VS2005
串口
转Socket通信带调试功能。通信帧按照电力规约进行封装。对上位机通信调试大有帮助.带源码。有
问题
随时
请教
:QQ 376033812 Email:xiaoligeng@126.com
基于FPGA的五子棋算法
使用Matlab编写的五子棋游戏,使用
串口
将数据传送到FPGA,进行处理后获得黑白子像素信息,存储后换算为坐标,转换为棋盘信息矩阵。在FPGA中实现简化的五子棋算法,计算出在剩下所有格点中利益值最大的点,从而确定下一步最有利的落子位置,将位置坐标重新发送给Matlab,Matlab将数据处理后得到下棋的位置,以此实现人机对弈。
《单片机基础》练习题及答案(推荐文档).doc
《单片机基础》练习题及答案(推荐文档).doc
webservice
本文档描述了软件开发过程中的总体架构,确定模块结构,划分功能模块,确定模块间的关系,帮助开发人员了解本系统的架构思想以及实现方式。为开发过程的顺利奠定基础
进程/线程/DLL
15,466
社区成员
49,169
社区内容
发帖
与我相关
我的任务
进程/线程/DLL
VC/MFC 进程/线程/DLL
复制链接
扫一扫
分享
社区描述
VC/MFC 进程/线程/DLL
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章