在您的场景中,线程正在响应阻塞读/写方法,等待直到检测到关键字或使用 waitForKeyword() 超时。不幸的是,当使用 readLines() 来测试应用程序时,只获得了文件的一小部分。另外,readLines 在第二次迭代时立即返回 false,无需等待超时。
问题源于 readLines() 的设计,它读取所有可用数据并将其分离为线。当处理一系列命令时,readLines() 仅读取文件的第一部分,因为它不检测关键字。随后,当再次调用它时,readLines() 返回 false,因为它已经迭代了整个可用数据。
有效地发送一系列命令并等待它们响应,考虑使用状态机方法。这提供了一种结构化且可靠的方法来管理命令和响应流,确保在继续之前收到预期的响应。
以下代码段演示了使用 Qt 的状态机实现QStateMachine 及相关类:
class Programmer : public StatefulObject { Q_OBJECT AppPipe m_port { nullptr, QIODevice::ReadWrite, this }; State s_boot { &m_mach, "s_boot" }, s_send { &m_mach, "s_send" }; FinalState s_ok { &m_mach, "s_ok" }, s_failed { &m_mach, "s_failed" }; public: Programmer(QObject * parent = 0) : StatefulObject(parent) { connectSignals(); m_mach.setInitialState(&s_boot); send (&s_boot, &m_port, "boot\n"); expect(&s_boot, &m_port, "boot successful", &s_send, 1000, &s_failed); send (&s_send, &m_port, ":HULLOTHERE\n:00000001FF\n"); expect(&s_send, &m_port, "load successful", &s_ok, 1000, &s_failed); } AppPipe & pipe() { return m_port; } };
在这个例子中,Programmer 封装了状态机,并提供了与设备通信的接口。状态转换是使用 send() 和 Expect() 函数定义的,分别处理发送命令和等待预期响应。
使用状态机有几个优点:
以上是状态机如何解决发送命令序列并等待响应时数据检索不完整的问题?的详细内容。更多信息请关注PHP中文网其他相关文章!