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)
return false;
status = _DSerial->write((char *)zf.data(),zf.size());
status = _DSerial->flush();
return status;
}
@ -231,7 +232,7 @@ uint16_t DLLN3X::rw_config(CONFIG arg, uint16_t data, CONFIG_RW_MASK mask)
}
case CONFIG::BAUDRATE: {
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("%X\n", zf.getData()[0]);
@ -304,25 +305,22 @@ int DLLN3X::readBytesUntil(uint8_t delimiter, uint8_t* buffer, qint64 maxSize)
QByteArray data;
qint64 bytesRead = 0;
while (bytesRead < maxSize)
{
if (_DSerial->bytesAvailable())
if (_DSerial->bytesAvailable() || _DSerial->waitForReadyRead(2000))
while (bytesRead < maxSize)
{
qint64 bytesReadNow = _DSerial->read((char *)(buffer) + bytesRead, 1);
bytesRead += bytesReadNow;
data.append((char *)(buffer) + bytesRead - bytesReadNow, bytesReadNow);
if (data.contains(delimiter))
if (data.contains(delimiter) || !(_DSerial->waitForReadyRead(20) || _DSerial->bytesAvailable()))
{
break;
}
}
else
{
break;
}
}
else
qDebug()<<"DL-LN3X: Read byte timeout!";
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.setFlowControl( QSerialPort::HardwareControl ); // 设置流控制(硬件数据流控制)
_serial_port.setFlowControl( QSerialPort::NoFlowControl ); // 设置流控制(无数据流控制)
// 当下位机中有数据发送过来时就会响应这个槽函数
connect(&_serial_port,&QSerialPort::readyRead,this,&SerialPortManager::_ready_for_read);
connect(&_serial_port,&QSerialPort::aboutToClose,this,&SerialPortManager::close);
@ -156,7 +156,11 @@ QByteArray SerialPortManager::read()
if (_opened && _handledBymanager)
{
readyRead(false);
bdata = _serial_port.readAll();
while(true){
bdata += _serial_port.readAll();
if (!_serial_port.waitForReadyRead(20))
break;
}
if (_recv_hex)
{
return bdata.toHex(' ').toUpper();
@ -217,7 +221,9 @@ bool SerialPortManager::write(QString data)
default:
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)