簡體   English   中英

Qt與Arduino串口通信(讀寫)

[英]Qt and Arduino serial communication (Read and Write)

我遇到了一個非常簡單的問題。

我正在嘗試制作一個 Qt GUI 應用程序來從 GUI 控制我的 Arduino(而不是從 Arduino IDE 的串行監視器控制它)。 我能夠使用 QSerialPort write() 方法成功寫入 Arduino,但我無法從 Arduino 讀取任何內容。 我可以從串行端口讀取的唯一方法是在我的 Qt 代碼中的 waitForBytesWritten() 中的 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");
     }

  }


}

嘗試連接QIODevice::readyRead信號:

    QObject::connect(&serialPort, &QSerialPort::readyRead, [&]() {
        standardOutput << "Recieved: " << serialPort.readAll() << endl;
    });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM