如何在循环发送更多数据之前等待 COM 端口接收事件

2024-04-06

我正在开发一个小组件,用于使用旧的索尼爱立信手机编写和读取 AT 命令。 向手机发送和写入数据完全没有问题,但是我希望能够暂停 SendATCmd 函数并等待 COM 端口组件通过通知事件通知我,然后再次恢复 SendATCmd 函数。

场景:我想获取手机中短信的数量。 通常我只是告诉电话:嘿,你有多少条短信? 并且手机会在通知事件中回复。 这一切都很好。

但我真正想做的是

if SendATCmd('CountSMS')>0 then
  for 0 to SMSCount do
    AddSMSToList;

SendATCmd 的代码如下所示:

function TSE_Z1010.SendATCmd(Cmd: string): TATResult;
begin
  fCOMPort.PutString(Cmd); //Sending AT command

  //Here is where I would like to pause this function
  //wait for the fCOMPort to notify me when data is available
  //and then resume this function again.

  result:=fTMPATResult;

end;

我尝试过使用 while 循环、暂停等,但除了一件事之外没有任何效果,那就是当我将 ShowMessage 放在应该暂停的位置时。 我不知道 ShowMessage 内部是如何工作的,但它似乎不会像 while 循环和暂停那样停止程序。

===================

修复。

我所要做的就是在uses子句中添加Forms,然后添加 while fTMPATResult.Full=false do Application.ProcessMessages;在我想暂停程序的部分。

“fTMPATResult”是组件内全局存储传入 COM 端口数据的变量。


虽然 AsyncPro 确实有一些解决方案(ontriggerdata),但它们是基于事件的,使得代码难以阅读/理解。

这是带有 AsyncPro 的 SendAndWaitForResponse (就像 Remy 建议的那样):

TForm1 = class(TForm)
 ...
private
    IOEvent           : THandle; // used for IO events
    IORx              : string;
    Comport           : TapdComport;
...


procedure TForm1.ComportTriggerAvail(CP: TObject; Count: Word);

var i       : integer;

begin
 for i:=1 to Count do
  IORx:=IORx+Comport.GetChar;
 SetEvent(IOEvent);
end;

function TForm1.SerialSAWR(tx : string; TimeOut : integer) : boolean;
begin
 Result := False;
 try
  IORx := ''; // your global var
  ResetEvent(IOEvent);
  Comport.PutString(tx);
  Result := WaitForSingleObject(IOEvent, TimeOut) = WAIT_OBJECT_0;
 except
  on E : Exception do
   // dosomething with exception
 end;
end;

// constructor part
IOEvent := CreateEvent(nil, True, False, nil);
// destructor part
 if IOEvent <> 0 then
  CloseHandle(IOEvent);

最好的解决方案是创建一个带有 comport 的线程,这样你的 GUI 就不会被阻塞。 我有几个使用 Asyncpro 的应用程序在生产中,它的工作方式就像一个魅力......

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在循环发送更多数据之前等待 COM 端口接收事件 的相关文章

随机推荐

  • 如何使用 queryExecute 设置调试输出查询名称

    我想知道是否有办法使用 queryExecute 设置调试输出查询名称
  • 在敏捷/Scrum 用户故事中,多少细节才足够? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 通常的反应是足够详细就足够了 在我们目前正在忙的项目中 该项目不完整并且在没有任何类型的 brs 文档 用户故事的情况下移交给我们 我们得
  • 在 JFileChooser 中仅打开 .xml 文件

    我正在开发一个java应用程序 我只需要 xml文件 现在我只想显示 xml文件在JFileChooser每当用户想要保存文件或打开现有文件时 这个可以只显示吗 xml files 您可以使用 JFileChooser API 来完成您的任
  • C++ 类中'typedef' 会自动继承吗?

    我曾经认为 typedef 不会自动继承 但下面的代码快照暗示了一些不同的东西 include
  • 以编程方式禁用三星上的应用程序省电模式

    我是消息应用程序的开发人员 我的应用程序被置于自动省电模式 这会阻止消息通过 当我进入三星手机上的 应用程序省电 选项 设置 gt 电池 gt 应用程序省电 选项 时 我可以看到该选项对于某些应用程序 例如 WhatsApp 和 Faceb
  • 从 QRunnable 发出信号

    我正在尝试从一个发送信号QRunnable到我的主要QObject 但由于某种原因它没有收到它们 这是正确的方法吗 这是一个小测试用例 import sys from PyQt4 QtGui import QApplication from
  • Django:搜索短语中各个单词的首字母?

    我有一个名为的 Django 模型Author 有一个名为name 它不分为姓氏 名字 class Author models Model name models CharField max length 200 unique True 例
  • 根据条件分割数据框

    我正在尝试将我的数据框分成两个基于medical plan id 如果为空 则进入df1 如果不空入df2 df1 df with medicalplanid df with medicalplanid medical plan id df
  • R quantmod:getFinancials

    我正在尝试导入在纽约证券交易所上市的所有公司的财务报表 这些公司的市值大于样本的第一个四分位 这是我的代码 require TTR require quantmod data init 2013 01 01 start date lt as
  • 是否可以将类的静态对象存储在共享首选项中?

    我正在开发一个项目 我正在创建一个静态class s object 所以当我switch off device at that time all the static objects are cleared所以我想存储到shared pre
  • Python:如何在 40 秒内更新 Google BigQuery 中的值?

    我有一张桌子在Google BigQuery我使用 Python 访问和修改pandas功能read gbq and to gbq 问题是追加 100 000 行大约需要 150 秒 而追加 1 行大约需要 40 秒 我想更新表中的值而不是
  • 获取组驱动器中当前 Word 文档的 OneDrive 项目 ID

    我正在研究一个Office js Word插件但文档存储在组驱动器上 我怎样才能获得其中一个或全部group id drive id and item id对于当前文档 相关问题is here https stackoverflow com
  • 如何返回不同的值及其计数?

    我想做的 希望 很简单 但我只是不太掌握正确的语法 我想返回表中的所有不同值 并计算每个值的记录数 所以 在 PHP 中 我有 result mysql query SELECT DISTINCT tagName FROM tagTable
  • KivyMD 顶部应用栏

    我正在尝试学习 Kivy 和 KivyMD 因为我想制作一个 Android 应用程序 但我陷入了第一个障碍 我想要一个工具栏 或者按照 KivyMD 文档的说法 TopAppBar 我正在尝试按照文档实现它 但出现错误Unknown Cl
  • JSON自动添加反斜杠

    我正在尝试使用 Gson 将 java 对象转换为 json 但是当我尝试打印它时 我得到了这个 JSON 用户 电子邮件 电子邮件受保护 cdn cgi l email protection 姓氏 Las 姓名 amy 密码 qwe123
  • 是否可以将时间戳添加为 firestore 数据库中的文档字段?

    在与云Firestore https firebase google com docs firestore 我在将数据添加到 Cloud Firestore https firebase google com docs firestore
  • 有没有办法使用基于范围的 for 循环迭代最多 N 个元素?

    有没有一种好的方法可以使用基于范围的容器来迭代容器中的最多 N 个元素for标准库中的循环和 或算法 这就是重点 我知道我可以使用 旧 for带条件循环 基本上 我正在寻找与此 Python 代码相对应的内容 for i in arr N
  • Swift NSTextField 文本消失

    这个问题可能存在于 Objective c 的一篇 6 年前的帖子中 我还没有找到最近有效的答案或问题 或者是用 Swift 编写的答案或问题 我正在使用故事板并且我已经子类化NSTextField 由于某种原因 当我单击该字段时 占位符会
  • SwiftUI:TextField 中的多颜色文本

    我想为 TextField 中的文本更改两种不同的颜色 对于第一个单词 颜色为深灰色 对于第二个单词 颜色为浅灰色 是否可以 TextField Dumble Dore text username 还有另一种方法只使用 SwiftUI 和我
  • 如何在循环发送更多数据之前等待 COM 端口接收事件

    我正在开发一个小组件 用于使用旧的索尼爱立信手机编写和读取 AT 命令 向手机发送和写入数据完全没有问题 但是我希望能够暂停 SendATCmd 函数并等待 COM 端口组件通过通知事件通知我 然后再次恢复 SendATCmd 函数 场景