в вашем сценарии, поток отвечает на метод блокировки чтения/записи, ожидая, пока он обнаружит ключевое слово или время, используя waitforkeword (). К сожалению, когда Readlines () используется для тестирования приложения, получается только небольшая часть файла. Кроме того, READLINES немедленно возвращает FALSE во время второй итерации, не ожидая тайм -аута.
. Проблема проистекает из дизайна readlines (), которая считывает все доступные данные и отделяет их на строки. Когда обрабатывается последовательность команд, Readlines () читает только первую часть файла, потому что она не обнаруживает ключевое слово. Впоследствии, когда он снова вызван, READLINES () возвращает false, поскольку он уже итерация по всем доступным данным.
для эффективной отправки последовательности команд и ожидания их ответов, рассмотрите возможность использования подхода машинного машины. Это обеспечивает структурированный и надежный метод управления потоком команд и ответов, гарантируя, что ожидаемый ответ получен перед продолжением. Q_object Apppipe m_port {nullptr, qiodevice :: readwrite, это}; Состояние 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"}; публика: Программист (QObject * parent = 0): statefulobject (parent) { ConnectSignals (); m_mach.setinitialstate (& s_boot); Отправить (& s_boot, & m_port, "boot \ n"); Ожидайте (& S_BOOT, & M_PORT, "Boot успешно", & S_SEND, 1000, & S_FAILED); Send (& s_send, & m_port, ": hullothere \ n: 00000001ff \ n"); Ожидайте (& S_SEND, & M_PORT, "Загрузить успешно", & s_ok, 1000, & s_failed); } Apppipe & pipe () {return m_port; } };
этого подхода
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; } };
обработка тайм-аута
асинхронная природа
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3