3

我正在使用 Qt 编写一个从串行线路读取数据的 C++ 程序。数据的“生产者”是一块 Arduino UNO 板。

Arduino 代码非常简单。目前,它只是生成一个随机数并通过串行线路发送。这是代码:

long randNumber;

void setup() {
  Serial.begin(9600);
  randomSeed(analogRead(0));
}

void loop() {
  randNumber = random(300);
  Serial.write(randNumber);
  delay(10);
}

我已经使用 Arduino 的“串行监视器”来验证数据是否通过串行线路。

在 Qt 方面,我有一个工作线程,它应该读取串行数据并相应地更新 UI 上的绘图。工作线程肯定正在运行,并且此代码正在执行(我已经检查过)。我的“端口列表”中只有一个设备显示,它是 Arduino,所以目前我直接连接到它。这是代码:

void doWork ()
{
    QList<QSerialPortInfo> port_list = QSerialPortInfo::availablePorts();
    QSerialPort serialPort;
    serialPort.setPort(port_list[0]);
    serialPort.setBaudRate(QSerialPort::Baud9600);

    if (!serialPort.open(QIODevice::ReadWrite))
    {
        cout << QObject::tr("Failed to open port COM3, error: %1").arg(serialPort.errorString()).toStdString() << endl;
    }

    while(!abort_thread)
    {
        int bytes_available = serialPort.bytesAvailable();
        if (bytes_available >= 4)
        {
            QByteArray byte_array = serialPort.read(4);
            int data = byte_array.toInt();
            emit signalDataReady(data);
        }
    }

    serialPort.close();
}

不幸的是,从来没有任何可用的字节。它成功打开串行端口,但没有字节通过。我在这里做错了什么?有任何想法吗?谢谢!

4

2 回答 2

1

您忘记在 bytesAvailable() 之前添加 waitForReadyRead()。

于 2016-04-28T05:15:18.700 回答
0

来自https://www.arduino.cc/en/Serial/Write

Serial.write(val)

val:作为单个字节发送的值

如果你写一个数字 Arduino 只发送一个字节,如果你想发送一个 long 那么你必须将它分解为一个数组并发送数组(或获取一个指向 long 地址的指针并发送每个字节)。

由于您的 Qt 代码期望读取四个字节,因此永远不会执行 if。

于 2016-04-28T01:37:11.657 回答