Qt Open Serial, но не пишется - PullRequest
0 голосов
/ 01 октября 2019

Я пытаюсь связаться с Arduino через последовательный порт, используя Qt. Когда я отправляю данные с Arduino на ПК, все работает хорошо, но когда я пытаюсь отправить данные с ПК на Arduino, он никогда не получает их. Серийный Arduino никогда не станет доступным.

Я не могу понять, что я делаю не так или где может быть проблема.

Communication.h

#ifndef QSERIALCOM_H
#define QSERIALCOM_H

#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMutex>

#include <string>

class QSerialCom : public QObject {
    Q_OBJECT

public:
    explicit QSerialCom(QObject* parent = nullptr);
    ~QSerialCom();

    static void printPortInfo();

    void updateThreads();

private:
    QList<QSerialPortInfo> ports;
    QSerialPort opened;

    QMutex openedmut;

    std::array<int, 6> transmission;

    bool automaticPortSelection;



public slots:
    void recieveUpdate();
    void recieveNewPort(QSerialPortInfo);
    void recieveSetAutomaticPortsSelection(bool);

signals:
    void sendDevicesChanged(QList<QSerialPortInfo> devs);
    void sendDoneUpdating();
};

namespace codes {
    static const char COMMSTART = 0;
    static const char COMMEND = 1;
    static const char ACK = 2;
    static const char ERR = 3;
}


Q_DECLARE_METATYPE(QSerialPortInfo)

#endif // QSERIALCOM_H

Communication.cpp

    #include "QSerialCom.h"

#include <QDebug>

#include "Control.h"

// Comparador de QSerialPortInfos
bool operator== (const QSerialPortInfo p1, const QSerialPortInfo p2) {
    return p1.portName() == p2.portName() &&
           p1.systemLocation() == p2.systemLocation() &&
           p1.manufacturer() == p2.manufacturer() &&
           p1.serialNumber() == p2.serialNumber();
}

void QSerialCom::printPortInfo() {
    for(const auto &port : QSerialPortInfo::availablePorts()) {
        qDebug() << "Nome: " << port.portName();
        qDebug() << "Localização: " << port.systemLocation();
        qDebug() << "Descrição: " << port.description();
        qDebug() << "Ocupado: " << port.isBusy();
        qDebug() << "Produtor: " << port.manufacturer();
        qDebug() << "Id: " << port.productIdentifier();
        qDebug() << "Número Serial: " << port.serialNumber();
        qDebug() << "Id do vendedor: " << port.vendorIdentifier();
    }
}

QSerialCom::QSerialCom(QObject* parent) : QObject(parent),
    ports(),
    opened(),
    openedmut(),
    transmission(),
    automaticPortSelection(true)
{}

QSerialCom::~QSerialCom() {}

void QSerialCom::updateThreads() {
    opened.moveToThread(thread());
}

void QSerialCom::recieveNewPort(QSerialPortInfo newport) {
    QMutexLocker lock(&openedmut);
    opened.setPort(newport);
    if(!opened.isOpen())
        opened.open(QIODevice::ReadWrite);
}

void QSerialCom::recieveUpdate() {
    Control::calculateAngles();

    auto newports = QSerialPortInfo::availablePorts();

    if(ports != newports) {
        emit sendDevicesChanged(newports);
        ports = newports;
        if(ports.size() != 0 && !opened.isOpen() && automaticPortSelection) {
            recieveNewPort(ports[0]);
        }
        opened.setBaudRate(QSerialPort::Baud9600);
        opened.setDataBits(QSerialPort::Data8);
        opened.setFlowControl(QSerialPort::NoFlowControl);
        opened.setParity(QSerialPort::NoParity);
        opened.setStopBits(QSerialPort::OneStop);
    }

    transmission[0] = 42;
    transmission[1] = 666;
    transmission[2] = -128;
    transmission[3] = 777;
    transmission[4] = 888;
    transmission[5] = 31415;

    if(opened.isOpen()) {
        char buf[1] = {codes::COMMSTART};
        printf("\n SENDING COMMSTART TO ARDUINO...");
        opened.putChar('A');
        printf("\n WRITING BYTES...");
        opened.waitForBytesWritten(-1);
        printf("\n COMMSTART SENT \n");
        printf("\nWAITING MSG FROM ARDUINO...");

        //THE CODE BLOCKS HERE
        opened.waitForReadyRead(-1);
        printf("\nRECEIVED");
        if(opened.bytesAvailable()) {
            opened.getChar(buf);


            if(buf[0] != codes::COMMSTART) {

                emit sendDoneUpdating();
                return;
            }
            printf("\n COMMSTART FROM ARDUINO RECEIVED \n");

            for(const auto sent : transmission) {
                opened.waitForBytesWritten();
                for(unsigned int i = 0; i < sizeof(int); ++i)
                    opened.putChar(reinterpret_cast<const char*>(&sent)[i]);
                opened.waitForBytesWritten(-1);
                opened.waitForReadyRead(-1);
                opened.getChar(buf);
                if(buf[0] != codes::ACK) {
                    emit sendDoneUpdating();
                    return;
                }
            }

            opened.putChar(codes::COMMEND);
            opened.waitForBytesWritten();
            opened.waitForReadyRead();
            opened.getChar(buf);
        }
    }

    else {
        printf("\n NOT OPENED \n");
    }

    emit sendDoneUpdating();
}

Код Arduino

void setup() {
    Serial.begin(9600);
    Serial.flush();
}

void loop() {
    if (Serial.available()) {
        // --snip--
    }
}
...