我正在使用 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