我最近在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字符完成它的答案所以我可以将comm掩码设置为EV_RXFLAG并等待#10字符出现,但是还有许多其他设备与我通信,并且它们并不总是发送帧结束字符。
我们将不胜感激。提前谢谢!
马里乌什。
答案 0 :(得分:1)
您的解决方案确实可行。我只是使用状态机来处理转换。
(伪码)
ioState := ioIdle;
while (ioState <> ioFinished) and (not aborted) do
Case ioState of
ioIdle : if there is data to read then set state to ioMidFrame
ioMidframe : if data to read then read, if end of frame set to ioEndFrame
ioEndFrame : process the data and set to ioFinished
ioFinished : // don't do anything, for doc purposes only.
end;