1

这是我的代码:(我使用了 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 嵌入式设备中对其进行测试时,此代码分两部分从串行设备中读取数据。() 我的字节中没有 \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 字节

4

1 回答 1

1

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

于 2017-01-09T11:51:15.040 回答