青山烬 2024-05-31 14:59 采纳率: 0%
浏览 15

QT通过串口接收发送数据

我写的按键行为,往下位机发送16CC进制,使下位机通过串口发送数据到上位机,死循环读取4096个数据点,每个数据由receivedData=serialPort->read(3);读取的三个字节凑出24位,通过QChart显示图表。为什么只能得到一个数据点,然后就超时等待退出循环了?

img

  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-05-31 15:00
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    根据您提供的代码片段和描述,您遇到的问题可能是由于几个原因造成的。以下是一些可能的原因和相应的解决方案:

    1. 超时设置不当: 您的代码中设置了timeout为1000毫秒,并且每次读取数据时都会调用waitForReadyRead(timeout)。如果下位机发送数据的速度慢于您的读取速度,这可能导致超时。

      解决方案:增加超时时间,或者调整读取数据的逻辑,使其不会立即超时。

    2. 数据读取逻辑: 您的代码中,每次循环都读取3个字节,然后尝试将这3个字节转换成一个24位的数值。但是,如果下位机发送的数据不是按照您期望的格式,或者数据之间有间隔,这可能导致您无法正确读取数据。

      解决方案:确保下位机发送的数据格式与您的读取逻辑相匹配。如果可能,与下位机的开发者沟通,确保数据的发送和接收格式一致。

    3. 数据解析错误: 您的代码中使用了static_cast<uint8_t>来转换读取的每个字节,然后通过位移和逻辑或操作来构建24位的数值。如果转换过程中有错误,可能导致数据解析不正确。

      解决方案:检查数据转换和解析的逻辑是否正确。确保每个字节的转换和组合都是按照预期进行的。

    4. 串口通信问题: 如果串口通信本身存在问题,比如波特率不匹配、串口连接不稳定等,也可能导致数据接收失败。

      解决方案:检查串口设置,确保波特率、数据位、停止位和奇偶校验位等设置正确。

    5. 代码逻辑错误: 您的代码中有一些可能的逻辑错误,比如else后面缺少{,以及一些变量命名可能存在问题(例如flag-false;应该是flag = false;)。

      解决方案:修正代码中的语法错误和逻辑错误。

    关于代码实现,您可以参考以下示例来改进您的代码:

    void widget::open_chart() {
        uint32_t sum = 0;
        const int timeout = 1000; // 可以根据实际情况调整超时时间
        QByteArray receivedData;
        char byte0, byte1, byte2;
        QList<QPointF> datas;
    
        // 发送数据到下位机
        QByteArray sendData;
        sendData = QByteArray::fromHex("cc");
        serialPort->write(sendData);
        bool bytesWritten = serialPort->waitForBytesWritten(3000);
        if (!bytesWritten) {
            qDebug() << "Failed to write to serial port:" << serialPort->errorString();
            return;
        } else {
            qDebug() << "Successfully sent" << bytesWritten << "bytes of data.";
        }
    
        for (int i = 0; i < 4096; ++i) {
            if (serialPort->waitForReadyRead(timeout)) {
                receivedData = serialPort->read(3);
                if (!receivedData.isEmpty()) {
                    byte0 = receivedData.at(0);
                    byte1 = receivedData.at(1);
                    byte2 = receivedData.at(2);
                    sum = static_cast<uint8_t>(byte0) << 16 |
                          static_cast<uint8_t>(byte1) << 8 |
                          static_cast<uint8_t>(byte2);
    
                    // 调试输出,可以根据需要调整
                    qDebug() << "@x%1".arg(static_cast<quint8>(byte0), 2, 16, QLatin1Char('@'));
                    qDebug() << "0x%1".arg(static_cast<quint8>(byte1), 2, 16, QLatin1Char('@'));
                    qDebug() << "0x%1".arg(static_cast<quint8>(byte2), 2, 16, QLatin1Char('@'));
                    qDebug() << sum;
    
                    // 将数据点添加到图表中
                    qreal x = i;
                    qreal y = static_cast<qreal>(sum);
                    datas.append(QPointF(x, y));
                }
            } else {
                qDebug("NULL");
            }
        }
    
        // 替换图表系列的数据
        series->replace(datas);
        datas.clear();
    }
    

    请注意,这只是一个示例,您可能需要根据实际情况进行调整。

    至于参考资料,您可以查阅以下资源:

    希望这些信息能帮助您解决问题。如果您需要进一步的帮助,请提供更多的上下文信息或者具体的错误信息。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 5月31日

悬赏问题

  • ¥15 远程安装一下vasp
  • ¥15 自己做的代码上传图片时,报错
  • ¥15 Lingo线性规划模型怎么搭建
  • ¥15 关于#python#的问题,请各位专家解答!区间型正向化
  • ¥15 unity从3D升级到urp管线,打包ab包后,材质全部变紫色
  • ¥50 comsol温度场仿真无法模拟微米级激光光斑
  • ¥15 上传图片时提交的存储类型
  • ¥15 VB.NET如何绘制倾斜的椭圆
  • ¥15 arbotix没有/cmd_vel话题
  • ¥15 odoo17的分包重新供应路线如何设置?可从销售订单中实时直接触发采购订单或相关单据