发送一系列命令并等待响应
通过串行端口进行通信通常需要发送一系列命令并等待响应每个命令。这可能是一个挑战,尤其是当您正在通信的设备需要时间来处理命令时。阻塞函数,例如 waitForReadyRead(),可能会在等待响应时停止程序。
阻塞函数的问题
您遇到的问题是 readLines( ) 当在一定的超时时间内没有找到期望的关键字时,返回 false。当设备在超时到期之前仅发送一小部分响应时,就会发生这种情况。
非阻塞解决方案
要克服此问题,您可以使用使用状态机实现的更多异步方法。状态机允许您为通信协议定义不同的状态,并根据特定事件在这些状态之间进行转换。
考虑以下状态机:
您可以创建状态机并使用 Qt 的状态机框架定义这些状态。 send()、expect() 和delay() 函数允许您发送命令、等待特定响应和延迟转换。
示例实现
以下是状态机的示例实现:
class Programmer : public StatefulObject { public: Programmer(QObject *parent = 0) : StatefulObject(parent) { ... send(&s_boot, &serial, "boot\n"); expect(&s_boot, &serial, "boot successful", &s_send, 1000, &s_failed); send(&s_send, &serial, ":HULLOTHERE\n:00000001FF\n"); expect(&s_send, &serial, "load successful", &s_ok, 1000, &s_failed); } ... };
使用状态的好处机器
使用状态机有几个好处:
以上是如何异步发送串行命令序列并有效处理响应?的详细内容。更多信息请关注PHP中文网其他相关文章!