我使用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
第二次尝试阅读。
端口打开如下:
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