Menghantar Urutan Perintah dan Menunggu Maklum Balas
Masalah: Cara menghantar urutan arahan ke peranti yang disambungkan melalui port bersiri dan tunggu jawapan, dengan pengendalian tamat masa dan keadaan ralat.
Penyelesaian menggunakan Mesin Negeri Qt Rangka Kerja:
Faedah:
- Tak segerak, tidak menyekat
- Pengendalian tamat masa automatik
- Kod yang jelas dan boleh dibaca struktur
Pelaksanaan:
-
Buat Mesin Negeri:
- Buat QStateMachine dan tentukan keadaan untuk setiap langkah dalam urutan komunikasi (cth., but, hantar, jangkakan).
-
Takrifkan Penjana Tindakan:
- Tentukan fungsi yang menerangkan tindakan yang perlu dilakukan apabila memasukkan setiap keadaan, seperti menghantar arahan atau mengharapkan respons.
-
Sambung Isyarat dan Peralihan:
- Sambungkan isyarat (cth., readyRead) untuk beralih daripada satu keadaan kepada satu lagi.
- Gunakan GuardedSignalTransition untuk menambah syarat pada peralihan berdasarkan data yang diterima.
-
Buat Objek Pengaturcara:
- Gunakan StatefulObject sebagai kelas asas untuk menguruskan mesin keadaan dan isyarat.
- Balut port bersiri dengan AppPipe (Peranti QIO yang tidak menyekat) dan tentukan tindakan untuk menghantar arahan dan mengharapkan balasan.
-
Tiru Gelagat Peranti (Pilihan):
- Buat StatefulObject (Peranti) yang lain untuk mensimulasikan tindak balas peranti kepada arahan.
-
Dalam fungsi utama:
- Segera Pengaturcara dan objek Peranti.
- Sambungkan AppPipes mereka untuk membenarkan komunikasi.
- Mulakan objek Pengaturcara dan jejakinya keadaan.
- Secara pilihan mulakan objek Peranti dan jejaki keadaannya.
Contoh Kod:
// Programmer object using Qt's State Machine Framework
class Programmer : public StatefulObject {
Q_OBJECT
AppPipe m_port;
QStateMachine m_mach;
State s_boot, s_send;
public:
Programmer() : StatefulObject() {
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);
... // Define other states and actions
}
void start() { m_mach.start(); }
};
// main function
int main() {
QApplication app;
Programmer prog;
Device dev;
dev.pipe().addOther(&prog.pipe());
prog.pipe().addHasOutgoing([](const QByteArray &data){ qDebug() << "> " << data; });
prog.pipe().addHasIncoming([](const QByteArray &data){ qDebug() << "< " << data; });
prog.start();
return app.exec();
}
Salin selepas log masuk
Kelebihan:
- Bersih dan tersusun kod, meminimumkan risiko keadaan perlumbaan atau respons terlepas.
- Kemungkinan untuk menambah peralihan keadaan yang kompleks dan senario pengendalian ralat.
- Kebolehlanjutan untuk menyokong pelbagai protokol komunikasi dengan urutan arahan yang berbeza.
Atas ialah kandungan terperinci Bagaimana untuk Menghantar Urutan Perintah Bersiri dan Mengendalikan Respons dengan Mesin Negeri Qt?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!