重置comm事件掩码

时间:2009-07-23 21:17:52

标签: delphi serial-port

我最近在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字符出现,但是还有许多其他设备与我通信,并且它们并不总是发送帧结束字符。

我们将不胜感激。提前谢谢!

马里乌什。

1 个答案:

答案 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;