【发布时间】:2016-04-13 08:05:49
【问题描述】:
我想使用 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 字节的帧时,它工作正常)
【问题讨论】:
-
见this answer。您必须创建自己的缓冲区来读取数据,直到满足您期望的某个特定大小。您也可以使用
QSerialPort::bytesAvailable方法检查可用的字节数。 -
嗨,我使用循环检查
QSerialPort::bytesAvailable,它总是显示512字节。 -
您是否在两次检查之间读取数据?
-
你是对的。现在想起来,这不是正确的做法。但是我不知道应该把
QSerialPort::bytesAvailable放在哪里,因为我不知道程序要等到readReady发出? -
您可以使用 Ilya 的建议,读取您自己的缓冲区中的所有数据,一旦该缓冲区达到 4000 字节或更多,就从您的缓冲区中删除前 4000 个字节并对这些数据进行处理。我认为可行的另一个选择是,如果您利用
QSerialPorts的内部缓冲区。当readyRead发出时,检查bytesAvailable。如果小于 4000,则什么都不做,如果大于或等于 4000,则读取 4000 字节,直到可用的字节小于 4000。
标签: c++ qt serial-port