qserialport не отправляет char в arduino

У меня возникли проблемы с попыткой отправить символ (то есть «R») из моего приложения qt5 на WIN7 в comport, который подключен к Arduino. Я собираюсь помигать светодиодом на Arduino, и моя часть Arduino работает нормально.

Вот мой qt-код:

#include <QTextStream>
#include <QCoreApplication>
#include <QtSerialPort/QSerialPortInfo>
#include <QSerialPort>
#include <iostream>
#include <QtCore>

QT_USE_NAMESPACE

using namespace std;
QSerialPort serial;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    QTextStream out(stdout);
    QList<QSerialPortInfo> serialPortInfoList = QSerialPortInfo::availablePorts();

    out << QObject::tr("Total number of ports available: ") << serialPortInfoList.count() << endl;


    foreach (const QSerialPortInfo &serialPortInfo, serialPortInfoList) {
        out << endl
            << QObject::tr("Port: ") << serialPortInfo.portName() << endl
            << QObject::tr("Location: ") << serialPortInfo.systemLocation() << endl
            << QObject::tr("Description: ") << serialPortInfo.description() << endl
            << QObject::tr("Manufacturer: ") << serialPortInfo.manufacturer() << endl
            << QObject::tr("Vendor Identifier: ") << (serialPortInfo.hasVendorIdentifier() ? QByteArray::number(serialPortInfo.vendorIdentifier(), 16) : QByteArray()) << endl
            << QObject::tr("Product Identifier: ") << (serialPortInfo.hasProductIdentifier() ? QByteArray::number(serialPortInfo.productIdentifier(), 16) : QByteArray()) << endl
            << QObject::tr("Busy: ") << (serialPortInfo.isBusy() ? QObject::tr("Yes") : QObject::tr("No")) << endl;
    }

    serial.setPortName("COM5");
    serial.open(QIODevice::ReadWrite);
    serial.setBaudRate(QSerialPort::Baud9600);
    serial.setDataBits(QSerialPort::Data8);
    serial.setParity(QSerialPort::NoParity);
    serial.setStopBits(QSerialPort::OneStop);
    serial.setFlowControl(QSerialPort::NoFlowControl);




        if(!serial.isOpen())
        {
          std::cout<<"port is not open"<<endl;
          //serial.open(QIODevice::ReadWrite);
        }

    if(serial.isWritable()==true)
    {
        std::cout<<"port writable..."<<endl;
    }



    QByteArray data("R");

    serial.write(data);
    serial.flush();
    std::cout<<"value sent!!! "<<std::endl;
    serial.close();

    return 0;
}

Мой исходный код состоит из двух частей,

1- serialportinfolist .... который работает просто отлично 2- открытие и запись данных... У меня нет проблем при запуске кода, и на дисплее отображается результат, как будто ничего не пошло не так!

ОДНАКО светодиод на плате не загорается, когда я запускаю этот код.

Я тестирую это с Arduino Serial Monitor, и он включается, но не может включиться из Qt.


person aro    schedule 25.01.2014    source источник


Ответы (2)


Вы ждете cr lf (0x0D 0x0A) в своем коде Arduino?

QByteArray ba;
ba.resize(3);
ba[0] = 0x5c; //'R'
ba[1] = 0x0d;
ba[2] = 0x0a;

Или добавьте его к своей строке с помощью

QByteArray data("R\r\n");

Or

QByteArray data("R\n");
person sebastian s.    schedule 25.01.2014
comment
Думаю, да, вот мой код Arduino: int input; инт светодиод = 13; недействительными настройками () { Serial.begin (9600); pinMode (светодиод, ВЫХОД); Serial.println(Запущено...); } void loop() { input = Serial.read(); если (вход == 'R') { цифровая запись (светодиод, ВЫСОКИЙ); // включаем светодиод (HIGH - уровень напряжения) delay(1000); Serial.println(светодиод горит!); } if (input == 's'){ digitalWrite(led, LOW); // включаем светодиод (HIGH - уровень напряжения) delay(1000); Serial.println(LED OFF!); } } - person aro; 25.01.2014
comment
означает ли это, что он отправляет «R», а каретка возвращается последовательно? если да, то не помогло, проблема осталась - person aro; 25.01.2014
comment
Прежде всего, даже если это работает до сих пор, вы должны поместить свою функцию serial.read в тест if(Serial.available() › 0) {}. - person sebastian s.; 25.01.2014
comment
Попробуйте отправить R\r\n или R\n на arduino для проверки. - person sebastian s.; 25.01.2014
comment
Я полагаю, вы имеете в виду serial.write, но я не получаю никаких доступных() или доступных функций ?? - person aro; 25.01.2014
comment
отправка R\r\n и R\n из arduino IDE работает нормально - person aro; 25.01.2014
comment
Я упоминаю функцию serial.read на вашем arduino!!! Поместите его в тест, если он доступен. Просто сделать это правильно... - person sebastian s.; 25.01.2014
comment
Вы пытались отправить данные QByteArray (R\r\n) - person sebastian s.; 25.01.2014
comment
сорри, я тоже проверял, не помогло - person aro; 25.01.2014
comment
да, я проверил оба ваших предложения, проблема не устранена - person aro; 25.01.2014
comment
Как это blogosfera.co.uk /2013/09/ код работает, и я не вижу существенной разницы с вашим кодом, я думаю, ваша версия qserialport испорчена. - person sebastian s.; 25.01.2014
comment
qserialport — это встроенный класс, который поставляется с qt5, я использовал qextserialport с qt4, и он работал хорошо, но я должен заставить его работать на qt5. также автор ссылки, которую вы вставили, не подтвердил, что отправка прошла успешно, и он/она попросил помощи по этому сообщению - person aro; 25.01.2014
comment
Я видел много сообщений с просьбой о помощи в serial.read в Интернете, но не могу найти что-то, что подтвердило бы запись с помощью qserialport, даже есть видео на Youtube, но я не смог найти подтвержденный тест. - person aro; 25.01.2014
comment
Забыл ссылку: Работал здесь .com/questions/18832285/ хотя - person sebastian s.; 25.01.2014
comment
Я думаю, что проблема сохраняется и там, она не должна иметь отношения к подключению/отключению arduino в моем случае, я думаю, это может быть ошибка с qserialport, как намекает автор в этом посте. - person aro; 25.01.2014
comment
Я ценю, если это не ошибка, любая другая помощь будет полезна - person aro; 25.01.2014

Я думаю, что нашел частичное решение, но оно все еще неполное.

Когда я нажимаю отладку в первый раз, qt не отправляет никакого сигнала на Arduino, но когда я нажимаю отладку во второй раз, он ведет себя так, как ожидалось.

Итак, не так ли странно, что нужно запускать его дважды, чтобы он заработал???

Дайте мне знать, если проблема существует где-то еще,

любая помощь...

person aro    schedule 01.02.2014