覆盆子Pi(QT C )和Arduino(Arduino IDE)之间的通信



我已经尝试了一个多星期以从覆盖物Pi(Qt C (通信到Arduino(Arduino IDE C (,但我一直在失败。

>

我在Google上进行了一些搜索,阅读了示例...但我仍然没有成功。好的,所以基本的事情是我需要连续传达从Raspberry Pi到Arduino的串行端口。我试图使代码尽可能简单。

最初,我将Raspberry Pi(QT C (的" J" char发送给Arduino(Arduino IDE C (,并等待该J,以使LED闪烁在Arduino上。但这是行不通的。。。交流&将数据覆盆子PI(QT C (发送到Arduino(Arduino IDE C (。我不知道这是什么问题。请帮助我解决这个问题。

在监视器中,9600 Baudrate

我已经附加了我在两边尝试过的程序。

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("Jn");
            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);
 }
}

显示的输出:

覆盆子QT创建者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

我建议您阅读有关QT事件系统的工作原理。所有QT iodevice派生的类都不同步地工作。您需要使用Qapplication来托管其对象系统。之后,您需要更改代码,以免它阻止QSerialport的IO线程。

我通常使用ReadyRead Singal,或者使用WaitforBytesWritten和WaitforreadReady组合。您应该查看QTSerialPort示例。您会发现其中的几个可能的实现,具体取决于您的应用程序需求。

您可以尝试一下,它可以正常工作。

#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();
}

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

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

制作serial.flush ()后,您立即关闭端口。有必要等到数据真正发送。例如,使用bool QSerialPort :: waitForBytesWritten (int msecs)

最新更新