首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在串口(QtSerialPort)读取输入字节的连续流

在串口(QtSerialPort)读取输入字节的连续流
EN

Stack Overflow用户
提问于 2021-07-04 16:26:42
回答 1查看 208关注 0票数 0

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

设置:我正在为我的车的数字仪表板工作,ECU可以通过串行连接发送实时引擎参数。

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

如有需要,请在此更详细介绍

下面是我现在的代码的一部分,它正在工作,但是非常慢,从我重新启动引擎时到看到值指示更改,这就像一个5-10秒的延迟。

代码语言:javascript
复制
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()时调用的”

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

EN

回答 1

Stack Overflow用户

发布于 2021-11-01 21:32:46

代码语言:javascript
复制
connect(&activeport, &QSerialPort::readyRead, this, &appmain::handledata);

connect(&yourport, &QSerialPort::readyRead, this, &functionpointer);

您需要创建一个函数并将它作为一个参数传递给connect()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68246759

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档