0

我正在尝试使用 Qt SerialPort 库读取串行端口。我可以使用超级终端读取数据。

在 Qt 中,我使用以下代码尝试做同样的事情。Qt 表示端口已正确打开,但由于某种原因,来自串行端口的 bytesAvailable 始终为 0。

serial.setPortName("COM20");

if (serial.open(QIODevice::ReadOnly))
    qDebug() << "Opened port " << endl;
else
    qDebug() << "Unable to open port" << endl;

serial.setDataBits(QSerialPort::Data8);

serial.setParity(QSerialPort::EvenParity);

serial.setBaudRate(QSerialPort::Baud115200);


qDebug() << "Is open?? " << serial.isOpen();


// Wait unit serial port data is ready
while (!serial.bytesAvailable())
{
    //qDebug() << serial.bytesAvailable()<<endl;
    continue;
}

QByteArray data = serial.read(100);

qDebug() << "This is the data -" << data << endl;

serial.close();

相比较而言,与上述代码结构相同的 MATLAB 代码,成功地读取了串口数据

%Serial Port Grapher - Shurjo Banerjee

s = serial('COM20');
s.BaudRate = 460800;
s.Parity = 'even';

try 
    input('Ready to begin?');
catch
end


fopen(s);

fh = figure();
hold on;

t = 1;

 while (s.BytesAvailable <= 0)
        continue
 end
 a = fread(s, 1)

 old_t = 1;
 old_a = a;

while true

   if (s.BytesAvailable > 0)
        a = fread(s, 1)

        figure(fh)
        t = t + 1;
        plot([old_t t], [old_a a]);
        old_t = t;
        old_a = a;
    end
end

fclose(s);
4

1 回答 1

0

1)这是错误:https ://codereview.qt-project.org/#change,47729

推荐解决方案:


我将 qserialport_win.cpp 中的第 161 行从:

return error;

return !error;

现在我的简化示例有效。


2)我也推荐:

第一步:打开端口:

            if (this->open(QIODevice::ReadWrite)) {
            } else {
                qDebug() << "\n Can't open port | " << this->errorString();
            }

两步:我建议检查参数设置:

            if (
                    this->setBaudRate(this->baudRate)
                    && this->setDataBits(this->dataBits)
                    && this->setParity(this->parity)
                    && this->setStopBits(this->stopBits)
                    && this->setFlowControl(this->flowControl)) {
                qDebug() << "\n[ info ]        Port settings successfully";
            } else {
                qDebug() << "\n[ error ]        Port settings failed";
            }

如果一切顺利,则建议使用 SIGNAL ReadyRead() 和您的 SLOT 来接收数据。

于 2013-11-08T23:04:06.350 回答