Я пытаюсь связаться с 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--
}
}