簡體   English   中英

QSerialPort 可以讀取超過 512 字節的數據嗎?

[英]Can QSerialPort read more than 512 bytes of data?

我想使用 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 字節的幀時,它工作正常)

沒有限制,但您不一定會在單個塊中接收所有數據。 您必須繼續收聽,直到獲得等待的字節數(或超時)。

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

您通常必須在循環中讀出數據(以確保獲得所有數據),這里是一段示例代碼,它等效於您的 serialReceived() 函數,不同之處在於它使用emit rxDataReady(newData);發出數據emit rxDataReady(newData); 給正在聽的人...

void QSerialPortReader::handleReadyRead()
{
    QByteArray newData;

    // Get the data
    while (mp_serialPort->bytesAvailable())
    {
        newData.append(mp_serialPort->readAll());
    }
    emit rxDataReady(newData);
}

編輯

雖然我沒有做任何最大大小檢查......但是如果你需要它添加它是微不足道的(即只使用 read(..., spaceAvail) 而不是 readAll 然后減少 spaceAvail ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM