SerialPort and Zigbee: recv and send bug fixed.

This commit is contained in:
Mentalflow 2024-02-19 23:43:44 +08:00
parent e367385b0e
commit e82af33bb8
Signed by: Mentalflow
GPG Key ID: 5AE68D4401A2EE71
2 changed files with 17 additions and 13 deletions

View File

@ -64,6 +64,7 @@ bool DLLN3X::send(ZigbeeFrame zf)
if (zf.getSrcPort() < 0x80) if (zf.getSrcPort() < 0x80)
return false; return false;
status = _DSerial->write((char *)zf.data(),zf.size()); status = _DSerial->write((char *)zf.data(),zf.size());
status = _DSerial->flush();
return status; return status;
} }
@ -231,7 +232,7 @@ uint16_t DLLN3X::rw_config(CONFIG arg, uint16_t data, CONFIG_RW_MASK mask)
} }
case CONFIG::BAUDRATE: { case CONFIG::BAUDRATE: {
if (zf.getData()[0] != 0x24) { if (zf.getData()[0] != 0x24) {
if (zf.getData()[0] != CONFIG_RESPONSE::DONE) if (zf.getData()[0] != CONFIG_RESPONSE::DONE)
{ {
printf("DLLN3X write config error: 0x"); printf("DLLN3X write config error: 0x");
printf("%X\n", zf.getData()[0]); printf("%X\n", zf.getData()[0]);
@ -304,25 +305,22 @@ int DLLN3X::readBytesUntil(uint8_t delimiter, uint8_t* buffer, qint64 maxSize)
QByteArray data; QByteArray data;
qint64 bytesRead = 0; qint64 bytesRead = 0;
while (bytesRead < maxSize) if (_DSerial->bytesAvailable() || _DSerial->waitForReadyRead(2000))
{ while (bytesRead < maxSize)
if (_DSerial->bytesAvailable())
{ {
qint64 bytesReadNow = _DSerial->read((char *)(buffer) + bytesRead, 1); qint64 bytesReadNow = _DSerial->read((char *)(buffer) + bytesRead, 1);
bytesRead += bytesReadNow; bytesRead += bytesReadNow;
data.append((char *)(buffer) + bytesRead - bytesReadNow, bytesReadNow); data.append((char *)(buffer) + bytesRead - bytesReadNow, bytesReadNow);
if (data.contains(delimiter)) if (data.contains(delimiter) || !(_DSerial->waitForReadyRead(20) || _DSerial->bytesAvailable()))
{ {
break; break;
} }
} }
else else
{ qDebug()<<"DL-LN3X: Read byte timeout!";
break;
}
}
return bytesRead; return bytesRead;
} }

View File

@ -122,7 +122,7 @@ bool SerialPortManager::open(QString port_name, QString baudrate, QString databi
{ {
_serial_port.setStopBits( QSerialPort::TwoStop ); // 设置停止位(停止位为2) _serial_port.setStopBits( QSerialPort::TwoStop ); // 设置停止位(停止位为2)
} }
_serial_port.setFlowControl( QSerialPort::HardwareControl ); // 设置流控制(硬件数据流控制) _serial_port.setFlowControl( QSerialPort::NoFlowControl ); // 设置流控制(无数据流控制)
// 当下位机中有数据发送过来时就会响应这个槽函数 // 当下位机中有数据发送过来时就会响应这个槽函数
connect(&_serial_port,&QSerialPort::readyRead,this,&SerialPortManager::_ready_for_read); connect(&_serial_port,&QSerialPort::readyRead,this,&SerialPortManager::_ready_for_read);
connect(&_serial_port,&QSerialPort::aboutToClose,this,&SerialPortManager::close); connect(&_serial_port,&QSerialPort::aboutToClose,this,&SerialPortManager::close);
@ -156,7 +156,11 @@ QByteArray SerialPortManager::read()
if (_opened && _handledBymanager) if (_opened && _handledBymanager)
{ {
readyRead(false); readyRead(false);
bdata = _serial_port.readAll(); while(true){
bdata += _serial_port.readAll();
if (!_serial_port.waitForReadyRead(20))
break;
}
if (_recv_hex) if (_recv_hex)
{ {
return bdata.toHex(' ').toUpper(); return bdata.toHex(' ').toUpper();
@ -217,7 +221,9 @@ bool SerialPortManager::write(QString data)
default: default:
break; break;
} }
return _serial_port.write(bdata); bool status = _serial_port.write(bdata);
status = _serial_port.flush();
return status;
} }
void SerialPortManager::zigbee_callback(zigbee_protocol::ZigbeeFrame zframe) void SerialPortManager::zigbee_callback(zigbee_protocol::ZigbeeFrame zframe)