当前位置: 首页 > 知识库问答 >
问题:

Qt和Arduino串行通信(读写)

阴鸿才
2023-03-14

我遇到了一个非常简单的问题。

我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的write()函数之后使用waitForReadyRead(5000)。但我必须使用5000毫秒的时间间隔才能成功阅读,这很耗时。请告诉我是否有任何更快的方法可以读取我的Qt GUI应用程序中的Arduino串行端口。

我正在发布我的Qt和Arduino代码。

Qt代码

#include "GuiApp.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QMessageBox>

GuiApp::GuiApp(QWidget *parent)
    : QMainWindow(parent)
{
    ui.setupUi(this);
    ui.lcdNumber_temp->display("--------");
    arduino = new QSerialPort(this);

    bool arduino_available = false;
    QString arduino_portName;


    foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
        if (serialPortInfo.hasVendorIdentifier() && serialPortInfo.hasProductIdentifier()) {
            if ((serialPortInfo.productIdentifier() == arduino_pid) && (serialPortInfo.vendorIdentifier() == arduino_vid)) {
                arduino_available = true;
                arduino_portName = serialPortInfo.portName();
            }
        }
    }

    //qDebug() << "Number of ports" << QSerialPortInfo::availablePorts().length() << "\n";
    //foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts()) {
    //  qDebug() << "Description" << serialPortInfo.description() << "\n";
    //  qDebug() << "Has Vendor Id?" << serialPortInfo.hasVendorIdentifier() << "\n";
    //  qDebug() << "Vendor Id" << serialPortInfo.vendorIdentifier() << "\n";
    //  qDebug() << "Has Product Id?" << serialPortInfo.hasProductIdentifier() << "\n";
    //  qDebug() << "Product Id" << serialPortInfo.productIdentifier() << "\n";
    //}


    if (arduino_available) {
        arduino->setPortName(arduino_portName);
        arduino->setBaudRate(QSerialPort::Baud9600);
        arduino->setDataBits(QSerialPort::Data8);
        arduino->setParity(QSerialPort::NoParity);
        arduino->setStopBits(QSerialPort::OneStop);
        arduino->setFlowControl(QSerialPort::NoFlowControl);
        arduino->open(QIODevice::ReadWrite);
        if (!arduino->isOpen()) {
            qDebug() << "Arduino Not Opening";
        }
        QObject::connect(ui.pushButton_connect,SIGNAL(clicked()),this,SLOT(button_pressed()));
        QObject::connect(arduino,SIGNAL(readyRead()),this,SLOT(readSerial()));
        //serial.write("OK ---");
    } else {
        qDebug() << "Couldn't find correct arduino port.\n";
        QMessageBox::information(this,"Serial Port Error","Couldn't open serial port to arduino.");
    }
}

GuiApp::~GuiApp()
{
    //serial.close();
    if (arduino->isOpen()) {
        qDebug() << "Arduino Closed!\n";
        arduino->close();
    }
}

void GuiApp::button_pressed() {
    if (arduino->isWritable()) {
        arduino->write("255");
        arduino->waitForBytesWritten(5000);

        //QByteArray s = arduino->readAll();
        //arduino->waitForReadyRead(1000);
        //std::string str = s.toStdString();
        //qDebug("My String %s", str);

    }
    else {
        QMessageBox::information(this, "Serial Port Error", "Couldn't write to Serial port.");
    }
}

void GuiApp::readSerial() {
    qDebug() << "Serial Port Works!!\n";
    QMessageBox::information(this, "Serial Port Works", "Opened serial port to arduino.");
    QByteArray serialData = arduino->readAll();
    QString temp = QString::fromStdString(serialData.toStdString());
    qDebug() << temp;
}

Arduino代码

#include <SPI.h>
#include <Controllino.h>


int led = CONTROLLINO_D1;
int led2 = CONTROLLINO_D2;
void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(led,OUTPUT);
  pinMode(led2,OUTPUT);
  digitalWrite(led,LOW);
  digitalWrite(led2,LOW);

}

void loop() {
  // put your main code here, to run repeatedly:
  if(Serial.available()) {
     const int val = Serial.parseInt();

     if(val == 255) {
        digitalWrite(led,HIGH);
        delay(1000);
        Serial.write("Ok");
     } else {
        digitalWrite(led2,HIGH);
        Serial.write("Not Ok");
     }

  }


}

共有1个答案

贡和裕
2023-03-14

尝试连接QIODevice::readyRead信号:

    QObject::connect(&serialPort, &QSerialPort::readyRead, [&]() {
        standardOutput << "Recieved: " << serialPort.readAll() << endl;
    });
 类似资料:
  • 我已经尝试了一个多星期通过串行端口从raspberry pi(QT C)到Arduino(Arduino IDE C)进行通信,但一直失败。 我在谷歌上做了一些搜索,阅读了这个例子。。。但我还是没有成功。好的,基本的事情是,我需要连续地通信从Raspberry pi发送到Arduino的串行端口命令。我试图使代码尽可能简单。 最初,我将J char从覆盆子pi(QT C)发送到Arduino(Ar

  • 我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出

  • 我正在尝试通过串行通信来溜冰树莓皮和阿杜伊诺。我的目的是用户控制Raspberry Pi的Arduino LED。 我找到了一个串行通信的示例代码,它每2秒自动向Arduino发送一个字符串。但我想做两件事: 更改发送的值,而不是Hello。 用户可以随时发送值,而不是自动发送。 你能帮我吗?我不擅长节点。js。

  • 我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应: 但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。 覆盆子终端: Arduino串行监视器: Mi代码为: Arduino草图: Python

  • 我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现

  • 我对Arduino和Processing都比较陌生,我一直在开发一种利用两者之间串行通信的代码。我的Arduino代码从压电传感器读取并打印数值,然后将数值发送给Processing,Processing根据数值绘制特定形状。该代码以前已经工作过,但由于某种原因,它不再工作。一切都会编译,但当我运行处理代码时,草图窗口是空的,并且仍然是空的。有几次“错误,禁用serialEvent()”出现了,但