QSerialPort可以读取超过512字节的数据吗?

时间:2016-04-13 08:05:49

标签: c++ qt serial-port

我想使用QSerialPort读取从设备传输的数据。该设备每次发送一个4000个数据字节的帧。我尝试使用以下简单代码

QSerialPort *serialPort;
char receivedData[4000];
int numRead = 0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    /* Initialize serial port*/
    serialPort = new QSerialPort(this);
    QString portName = "COM6";
    qint32 baudRate = 460800;
    serialPort->setPortName(portName);
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(QSerialPort::Data8);
    serialPort->setParity(QSerialPort::NoParity);
    serialPort->setStopBits(QSerialPort::OneStop);
    serialPort->setFlowControl(QSerialPort::NoFlowControl);
    serialPort->setReadBufferSize(4000);
    if (!serialPort->open(QIODevice::ReadOnly)) {
        qDebug() << "Cannot open comport";
    }
    connect(serialPort, SIGNAL(readyRead()), this, SLOT(serialReceived()));
}

void MainWindow::serialReceived()
{
    numRead = serialPort->read(receivedData, 4000);
    serialPort->flush();
}

问题是:它总是显示只读取512个数据字节。如何读取整个4000字节的数据帧? (当我使用Matlab读取这个4000字节的帧时,它工作正常)

2 个答案:

答案 0 :(得分:1)

没有限制,但您不一定会收到单个块中的所有数据。 你必须继续听,直到你有等待的字节数(或超时)。

void MainWindow::serialReceived()
{
    receivedData.append(serialPort->readAll());
    if(receivedData.size() >= 4000) {
       // we're full
    }
}

答案 1 :(得分:1)

你通常必须在循环中读出数据(以确保你得到它),这里是一段示例代码,它等同于你的serialReceived()函数,除了它使用{{1}发出数据无论谁在听......

emit rxDataReady(newData);

修改

虽然我没有做任何最大尺寸检查......但是如果你需要的话,这是微不足道的(即只需使用read(...,spaceAvail)而不是readAll然后减少spaceAvail ...