QT串口数据读取异常

曲79 2024-12-14 18:00:55
void MainWindow::on_serial_open_clicked()
{
    QSerialPort serial;
    serial.setPortName(ui->serial_box->currentText());
    serial.setBaudRate(ui->bate_box->currentText().toInt());
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    qDebug() << serial.portName() << serial.baudRate() << endl;
    if (serial.open(QIODevice::ReadOnly))
    {
        qDebug() << "串口打开成功";
        if(serial.waitForReadyRead(1000))
        {
            for(int i = 0; i <= 100; i++)
            {
                data_efficient = convert_data(serial);
                qDebug() << data_efficient;
            }
            serial.close();
            qDebug() << "串口已关闭";
        }
        else
        {
            qDebug() << "串口连接超时";
            serial.close();
            qDebug() << "串口已关闭";
        }
    }
    else
    {
        qDebug() << "串口打开失败:" << serial.errorString();
    }
}


void MainWindow::on_serial_check_clicked()
{
    ui->serial_box->clear();
    foreach (const QSerialPortInfo &serial_info, QSerialPortInfo::availablePorts())
    {
        ui->serial_box->addItem(serial_info.portName());
    }
}

QList<QString> convert_data(QSerialPort &serial)
{
    QList<QString> convert;
    for(int i = 0; i <= 32; i++)
    {
        convert.append(serial.read(1).toHex());
    }
    return convert;
}

 

如图,打开串口后原计划接收101个长度为33的QList的数据,但是实际上接收100个字节后就接收不到数据了,将程序改为每次读取1个字节,循环101次也会出现上述问题

已知数据发送设备状态正常,请教各位大神是哪里出现了问题

 

 

 

...全文
369 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复 1

这受限于你的波特率,正常1 个起始位,8 个数据位,0 个校验位,1 个停止位;要传输一个字节(8 位)的数据,则我应该在总线上产生 10 个电平变换,也就是串行总线上,需要 10 位,才能发送 1 个字节数据。1 秒可以发送 57600 位,那么用 57600 /10 ,就是1秒可以发送 5760个字节数据;你想一次性秒读完所有101*33个字节数据,那么就要修改波特率,或者修改函数成循环读取,直到读取完成所有数据

void MainWindow::on_serial_open_clicked()
{
    QSerialPort serial;
    serial.setPortName(ui->serial_box->currentText());
    serial.setBaudRate(ui->bate_box->currentText().toInt());
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    qDebug() << serial.portName() << serial.baudRate() << endl;
    if (serial.open(QIODevice::ReadOnly))
    {
        qDebug() << "串口打开成功";
        while (1)
        {
            if (serial.waitForReadyRead(1000))
            {
                for (int i = 0; i <= 100; i++)
                {
                    data_efficient = convert_data(serial);
                    qDebug() << data_efficient;
                }
                serial.close();
                qDebug() << "串口已关闭";
                break;
            }
            else
            {
                qDebug() << "串口连接超时";
                serial.close();
                qDebug() << "串口已关闭";
                break;
            }
        }
    }
    else
    {
        qDebug() << "串口打开失败:" << serial.errorString();
    }
}


void MainWindow::on_serial_check_clicked()
{
    ui->serial_box->clear();
    foreach(const QSerialPortInfo &serial_info, QSerialPortInfo::availablePorts())
    {
        ui->serial_box->addItem(serial_info.portName());
    }
}

QList<QString> convert_data(QSerialPort &serial)
{
    QList<QString> convert;
    for (int i = 0; i <= 32; i++)
    {
        convert.append(serial.read(1).toHex());
    }
    return convert;
}


mideum 2024-12-18
  • 打赏
  • 举报
回复 2

你的waitForReadyRead只调用了一次,有充分可能循环执行完的时候数据还没接收完
你可以看一下QSerialPort文档里的代码例子,waitForReadyRead是应该要放在循环里的

16,816

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧