Rumah > pembangunan bahagian belakang > C++ > Bagaimana untuk Menghantar Urutan Perintah Bersiri dan Mengendalikan Respons dengan Mesin Negeri Qt?

Bagaimana untuk Menghantar Urutan Perintah Bersiri dan Mengendalikan Respons dengan Mesin Negeri Qt?

Linda Hamilton
Lepaskan: 2024-12-17 04:43:24
asal
372 orang telah melayarinya

How to Send a Sequence of Serial Commands and Handle Responses with Qt's State Machine?

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:

  1. Buat Mesin Negeri:

    • Buat QStateMachine dan tentukan keadaan untuk setiap langkah dalam urutan komunikasi (cth., but, hantar, jangkakan).
  2. Takrifkan Penjana Tindakan:

    • Tentukan fungsi yang menerangkan tindakan yang perlu dilakukan apabila memasukkan setiap keadaan, seperti menghantar arahan atau mengharapkan respons.
  3. 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.
  4. 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.
  5. Tiru Gelagat Peranti (Pilihan):

    • Buat StatefulObject (Peranti) yang lain untuk mensimulasikan tindak balas peranti kepada arahan.
  6. 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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan