gpt4 book ai didi

c++ - 在 Qt 中等待数据从串口到达

转载 作者:行者123 更新时间:2023-11-28 00:15:41 25 4
gpt4 key购买 nike

我在我的 qt 应用程序中使用串口连接。我的问题 - 发送命令后我无法取回控制权(或值来自 comm 端口)。

我有一个名为serial.cpp 的类,它负责串口连接。此类包含 2 个队列。一个用于从 comm 端口保存字节,第二个用于解码消息。该类具有以下功能:

void Serial::sendCommand(QString s)
{
QString sometext = s;
QByteArray ba = QByteArray::fromHex(sometext.toLatin1());
serial->write(ba);
}

void Serial::serialReceived()
{
QByteArray ba ;
serialArray = serial->readAll();
for (int i=0; i<sizeof(serialArray);i++)
{
queueBytes.enqueue(serialArray[i]); // queue for saving the bytes
}

QVector<int> vect = queueBytes.toVector();

packetSize = 6;
if (vect.size() >= packetSize)
{ // the whole packet arrived
for (int i =0 ;i<packetSize;i++)
{
item = queueBytes.dequeue();
ba.append(item);
}
}
if (ba.toHex() == "12ee02010176")
queueMsgs.enqueue("ACK");

// ... and so on
}

这是调用类:

void Engine::onNewMessageFromAppReceived(int msgId,QString args)
{
serial->sendCommand("ee1203190209005569");

while (serial->queueMsgs.size() == 0) // infinite loop-the queue is always empty
{
usleep(1);
}

QVector<QString> vect2 = serial->queueMsgs.toVector();
qDebug() << vect2 << "get ack---" ;
}

请你帮忙

最佳答案

QSerialPort 类继承自 QIODevice 其中有 waitFor...可能是您正在寻找的方法。看看these docs .

如果你想异步处理串口,使用readyRead信号并在您连接到该信号的功能中执行读取。如果您不介意该操作被阻塞,waitForReadyRead函数就是您要找的。

好方法

这里是使用 Qt's signals and slots mechanism 的正确方法.这不会阻止您的 GUI 并让您的应用程序响应用户操作,即使您正在等待串行端口也是如此。

  1. 将函数连接到 bytesWritten信号
    串口发送数据后要执行的代码放在该函数中。
  2. 将函数连接到 readyRead信号从串口读取数据后要执行的代码应该放在这个函数中。
  3. 打开端口

糟糕的方式

在某些情况下,您可以这样做,但它是阻塞,这意味着您的 GUI 将在您的应用程序等待串行端口时卡住。我不建议这样做。

  1. 打开端口
  2. 发送数据
  3. 调用waitForBytesWritten
  4. 调用waitForReadyRead

工作示例代码

Qt 有一个 vast amount of working example code .甚至还有examples about how to use QSerialPort ,它们非常值得一试。您可能对 async writer example 最感兴趣和 async reader example .

关于c++ - 在 Qt 中等待数据从串口到达,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30489754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com