Raspberry pi (QT C++) 和 Arduino (Arduino IDE) 之间的通信

Communication between Raspberry pi (QT C++) and Arduino (Arduino IDE)

我已经尝试了一个多星期,通过串行端口从 raspberry pi (QT C++) 到 Arduino (Arduino IDE c++) 进行通信,但我一直失败。

我在 google 上做了一些搜索,阅读示例...但我仍然没有成功。好的,基本的事情是我需要连续通信串口发送命令从 Raspberry pi 到 Arduino。我尽量保持代码简单。

最初我将 "J" 字符从 raspberry pi (QT C++) 发送到 Arduino (Arduino IDE c++) 并等待那个 J,让 Arduino 上的 LED 闪烁.但它不起作用.. 即使我没有得到任何用于连接和通信以及将数据 raspberry pi (QT C++) 发送到 Arduino (Arduino IDE c++) 的示例。我不知道到底是什么问题。请帮助我解决问题。

监听中,9600波特率

我附上了我在两个 s 上都试过的程序ide。

main.cpp

#include <iostream>
#include <QIODevice>

#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QString>

using namespace std;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Dialog w;
    w.show();

    QSerialPort serialPort;
    serialPort.setBaudRate(QSerialPort::Baud9600);

    QSerialPortInfo info("ttyUSB0");
        qDebug() << "Name        : "     << info.portName();
        qDebug() << "Description : "     << info.description();
        qDebug() << "Busy:"              << info.isBusy();

        QSerialPort serial;
        serial.setPortName("ttyUSB0");

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

        serial.open(QSerialPort::ReadWrite);
        cout<<"Readable    :"<<serial.isReadable()<<endl;
        cout<<"Writable    :"<<serial.isWritable()<<endl<<endl;

        if (serial.isOpen() && serial.isWritable())
        {
            qDebug() << "Is open : " << serial.isOpen() << endl;
            qDebug() << "Is writable : " << serial.isWritable() << endl;

            qDebug() << "Ready..." << endl;
            serial.write("J");

            QByteArray ba("J\n");

            serial.write(ba);
            {
                QByteArray ba("J");
                serial.write(ba);
                serial.flush();
                qDebug() << "data has been send" << endl;
                serial.close();
            }
            if (serial.bytesToWrite() > 0)
            {
                serial.flush();
                if(serial.waitForBytesWritten(1000))
                {
                    qDebug() << "data has been send" << endl;
                }
            }
            if(serial.flush())
                {
                    qDebug() << "ok" << endl;
                }
                qDebug() <<"value sent "<< endl;
                serial.close();
        }
        else
        {
            qDebug() << "An error occured" << endl;
        }
    return a.exec();
}

Arduino代码:

int led = 13, avlb = 0;

void setup() 
{ 
Serial.begin(9600); 
pinMode(led, OUTPUT); 
Serial.println("started");
}

void loop() 
{ 

 if (Serial.available() > 0)
{
    Serial.println("available");
    Serial.println(Serial.available());  
    delay(2000); 
    digitalWrite(led, HIGH);  
    delay(5000);           

  if(Serial.read() == 'J')
 {
   Serial.println("read");
   Serial.println(Serial.read());
   delay(2000);
   digitalWrite(led, LOW);   
   delay(1000);  
 }  
}

else
 {
   Serial.println("not available");
   delay(1000);
 }
}

显示的输出:

Raspberry qt creator ide o/p:

Name        :  "ttyUSB0"
Description :  "FT232R USB UART"
Busy: false

Readable    :1
Writable    :1

Is open :  true 

Is writable :  true 

Ready... 

data has been send 

bool QSerialPort::flush(): device not open
value sent

Arduino Ide 输出显示:

started

not available
not available
not available
not available
not available
not available
not available
not available
not available

您问题的答案在以下代码中:

QByteArray ba("J");
serial.write(ba);
serial.flush();
qDebug() << "data has been send" << endl;
serial.close();

完成serial.flush ()后,立即关闭端口。需要等到数据真正发送完毕。例如,使用 bool QSerialPort :: waitForBytesWritten (int msecs).

我建议您阅读 Qt 事件系统的工作原理。所有 Qt IODevice 派生 类 异步工作。您需要使用 QApplication 来托管其对象系统。之后,您需要更改代码,使其不会阻塞 QSerialPort 的 io 线程。

我通常使用 readyRead 信号或者我使用 waitForBytesWritten 和 waitForReadReady combination.You 应该看看 QtSerialPort examples。根据您的应用程序需求,您会发现有几种可能的实现方式。

你可以试试这个,它会很好用。

#include <QCoreApplication>
#include <iostream>
#include <QSerialPort>
#include <QDebug>
#include <Windows.h>
#include <QElapsedTimer>

using namespace std;
QSerialPort serial;
QElapsedTimer timer;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
    serial.setPortName("ttyUSB0");
    serial.open(QIODevice::ReadWrite);

       serial.setBaudRate(QSerialPort::Baud9600);
       serial.setDataBits(QSerialPort::Data8);
       serial.setParity(QSerialPort::NoParity);
       serial.setStopBits(QSerialPort::OneStop);
       serial.setFlowControl(QSerialPort::NoFlowControl);

       while(!serial.isOpen()) serial.open(QIODevice::ReadWrite);

       if (serial.isOpen() && serial.isWritable())
       {
       qDebug() << "Serial is open";

       QByteArray output;
       QByteArray input;

       while(true)
       {
         output = "a";
         serial.write(output);
        serial.flush();
        timer.start();
       // Sleep(80);
        qDebug() << timer.elapsed();

         serial.waitForBytesWritten(100);
         serial.waitForReadyRead(100);

        if(serial.bytesAvailable()>=18)
         input = serial.read(18);
        qDebug()<<input;
         }
       }
    return a.exec();
}