【问题标题】:Resetting comm event mask重置通信事件掩码
【发布时间】: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


【解决方案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;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 1970-01-01
    相关资源
    最近更新 更多