微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在串行端口 (QtSerialPort)

如何解决在串行端口 (QtSerialPort)

所以我实际上让它工作,但它非常慢。我没有使用 Qt 库的经验,也很少使用串行通信和 C++,所以我确信我的方法效率极低。

设置:我正在为我的汽车设计一个数字仪表板,ECU 可以通过串行连接发送实时发动机参数。

  1. 向 ECU 发送连接请求(一次)
  2. 发送参数请求,例如rpm(一次)
  3. 它发送一个连续的字节流(直到您请求它停止)。格式为“FF02----”重复,在十六进制中,FF只是一个分隔符,02是后面2个字节的数据,--是引擎参数的十六进制值。

More detailed here if needed

这是我现在正在运行的代码的一部分,但速度非常慢,从我启动引擎到我看到值指示变化有整整 5-10 秒的延迟。

QObject::connect(ser,&QSerialPort::readyRead,[&]
{
    if ((m_userName == "4") and (ser->bytesAvailable()))
    {
        QByteArray incomingByte = ser->read(1).toHex();

        if (incomingByte == "ff")
        {
            dataBuff = "";
        }

        dataBuff += incomingByte;

        //converting the incoming data once all 4 bytes are received
        if (dataBuff.length() == 8)
        {
            QString revLsb = tr(dataBuff.mid(6,2));
            QString revMsb = tr(dataBuff.mid(4,2));

            bool bStatus1 = false;
            bool bStatus2 = false;

            uint nHexLsb = revLsb.toUInt(&bStatus1,16);
            uint nHexmsb = revMsb.toUInt(&bStatus2,16);

            float revlsb = nHexLsb * 12.5 * 256.0;
            float rev =  nHexmsb * 12.5 + revlsb;

            if ((rev != 0) & (rev != 12.5))
            {
                rev = rev / 1000;
                qDebug() << "Revs: " << rev << " rpm";
                m_rpmVal = rev;
                emit rpmValChanged();
            }
        }
    }
});

我使用 QObject::connect 是因为我在某处看到“//当 readyRead() 发出时调用

我应该使用什么以及在哪里更有效地读取传入的字节?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。