[英]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.