【发布时间】:2009-07-23 21:17:52
【问题描述】:
我最近一直在Delphi中做重叠串口通信,有一个问题我不知道如何解决。
我与调制解调器通信。我将请求帧(AT 命令)写入调制解调器的 COM 端口,然后等待调制解调器响应。端口的事件掩码设置为 EV_RXCHAR,所以当我写一个请求时,我调用 WaitCommEvent() 并开始等待数据出现在输入队列中。当重叠等待事件结束时,我立即开始从队列中读取数据并立即读取设备发送的所有数据:
1) 写一个请求
2) 调用 WaitCommEvent() 并等待等待完成
3)读取设备发送的所有数据(不仅是此时输入队列中的数据)
4) 做某事然后转到 1
在输入队列中出现第一个字节后等待事件完成。然而,在我的读取操作期间,队列中出现了更多字节,并且每个字节都会导致设置一个内部事件标志。这意味着当我从队列中读取所有数据然后第二次调用 WaitCommEvent() 时,它会立即返回 EV_RXCHAR 掩码,即使没有要读取的数据。
我应该如何处理读取和等待事件以确保 WaitCommEvent() 返回的事件掩码始终有效?是否可以重置串口的标志,以便当我从队列中读取所有数据并在此之后调用 WaitCommEvent() 时,它不会立即返回在我读取数据之前有效的掩码?
我想到的唯一解决方案是:
1) 写一个请求
2) 调用 WaitCommEvent() 并等待等待完成
3)读取设备发送的所有数据(不仅是此时输入队列中的数据)
4) 调用 WaitCommEvent(),它应该立即返回 true,同时重置内部设置的事件标志
5) 做某事并转到 1
这是个好主意还是愚蠢?当然我知道调制解调器几乎总是用 CRLF 字符完成它的答案,所以我可以将通信掩码设置为 EV_RXFLAG 并等待#10 字符出现,但是我与之通信的还有许多其他设备,它们并不总是发送帧结束字符。
您的帮助将不胜感激。提前致谢!
马吕斯。
【问题讨论】:
-
您可以使用 .而不是括号,这样您就不必添加 BR 标签来强制换行。此外,要在 markdown 中强制换行,只需在行尾添加两个空格。
标签: delphi serial-port