请教关于串口通信中读串口的问题

weihao2008 2008-10-16 04:06:37
现在有一个串口通信的系统,用的是同步处理,现在的系统是用一个子线程不停地读
串口,读到数据就分析。这样的话,当串口中没有数据的时候,这个子线程也还在不停地读
串口,这样就占用了很多cpu时间,我想问一下有没有什么办法,可以在串口收到数据时,读串口
,没有数据的时候 就不读?
...全文
241 25 打赏 收藏 转发到动态 举报
写回复
用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)

15,466

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧