SerialPort and Zigbee: recv and send bug fixed.
This commit is contained in:
parent
e367385b0e
commit
e82af33bb8
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue