發送一系列命令並等待回應
透過序列埠進行通訊通常需要發送一系列命令並等待回應每個命令。這可能是一個挑戰,尤其是當您正在通訊的設備需要時間來處理命令時。阻塞函數,例如 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中文網其他相關文章!