0

QSerialPort クラスを使用して、Network<->Serialコンバーター ( Moxa NPort ) を使用してネットワーク経由でハードウェア モジュールからデータを読み取ります。デバイスは正しいデータを送信しますが、受信側はデータ パケット全体を一度に読み取ることができません。たとえば、クライアントは次のように送信します。

0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0xa

受信者は取得します

0x01 0x02 0x03 0x04 0x05 0x06

まずはやってみる

0x07 0x08 0x09 0xa

2 回目の読み取り試行時。

ポートは次のように開かれます。

m_port.setBaudRate(QSerialPort::Baud9600);
m_port.setDataBits(QSerialPort::Data8);
m_port.setStopBits(QSerialPort::OneStop);
m_port.setFlowControl(QSerialPort::NoFlowControl);
m_port.setParity(QSerialPort::NoParity);
m_port.open(QSerialPort::ReadWrite);
m_port.setBreakEnabled(false);

そして、これがプログラムの読み取り方法です。(以下の関数は、500ms 間隔のタイマーによって実行され、単純なポーリング プロトコルを実装しています)

qint64 written_data_size = this->m_port.write(m_openGate);
if(written_data_size == -1){
    emit message("Unable to write to serial port.");
    return;
}
m_port.flush();
bool bytes_written = this->m_port.waitForBytesWritten(100);
if(!bytes_written){
    emit message("No data has been written to serial port.");
    return;
}
// Read status
this->m_port.waitForReadyRead(100);
QByteArray data = this->m_port.readAll(); // ===> Not all packet is read
4

0 に答える 0