为什么Qt(4.8)串口(qextserialport)从设备读取数据2部分?

时间:2017-01-09 08:13:15

标签: c++ qt embedded-linux qextserialport

这是我的代码:(我使用了qextserialport)

SerialPort::SerialPort(QString port)
{
    sp=new QextSerialPort;
    sp->setPortName(port);
    /*port->setBaudRate(BAUD9600);
    port->setFlowControl(FLOW_OFF);
    port->setParity(PAR_NONE);
    port->setDataBits(DATA_8);
    port->setStopBits(STOP_2);*/
    sp->setBaudRate(BAUD115200);
    sp->setDataBits(DATA_8);
    sp->setFlowControl(FLOW_OFF);
    sp->setParity(PAR_NONE);
    sp->setStopBits(STOP_1);
    sp->open(QIODevice::ReadWrite);
    connect(sp,SIGNAL(readyRead()),this,SLOT(ReadData()));

}

void SerialPort::ReadData()
{
    QByteArray ba;
    ba.resize(512);
    ba=sp->readAll();
    emit DataRecieve(ba);
}

此代码首先在Ubuntu上运行,并显示从设备接收的所有字节,但是当我在linux嵌入式设备中测试时,此代码从串行设备中读取数据,分为2部分。 ()我的字节中没有\ n。 我将代码更改为此代码:

void SerialPort::ReadData()
{
    QByteArray ba;
    ba.resize(512);
    if(sp->bytesAvailable()>0 || sp->waitForReadyRead(20000))
    {
    qDebug()<<sp->bytesAvailable();
    ba=sp->readAll();
    qDebug()<<ba.toHex();
    emit DataRecieve(ba);
    }
}

但我的输出又是:

4 "aa5524010400000000000000"   
12 "000000000000000000002801"

但它应该是:

"aa5524010400000000000000000000000000000000002801"

我的输出大小可能是48字节或512字节

1 个答案:

答案 0 :(得分:1)

这取决于串口驱动缓冲区。例如,您可以在一个就绪字节上获得readyRead()信号。 您应该将接收到的字节保存到中间缓冲区并进行处理。