Qt не получает последовательные данные от arduino

Я пишу программу на C++ с использованием Qt, которая читает данные из последовательной строки. "Производителем" данных является доска 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, у меня есть рабочий поток, который должен читать последовательные данные и соответствующим образом обновлять график в пользовательском интерфейсе. Рабочий поток определенно выполняется, и этот код выполняется (я проверял). У меня есть только одно устройство в моем "списке портов", которое появляется, и это 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();
}

К сожалению, никогда не бывает доступных байтов. Он успешно открывает последовательный порт, но байты не проходят. Что я здесь не так делаю? Есть идеи? Спасибо!

2 ответа

Решение

Вы забыли добавить waitForReadyRead() перед bytesAvailable().

С https://www.arduino.cc/en/Serial/Write:

Serial.write (Val)

val: значение для отправки в виде одного байта

Если вы пишете число, Arduino отправляет только один байт, если вы хотите отправить long, вы должны разложить его на массив и отправить массив (или получить указатель на адрес long и отправить каждый из байтов).

Поскольку ваш код Qt предполагает чтение четырех байтов, if никогда не выполняется.

Другие вопросы по тегам