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

树莓pi(QT C)和Arduino(Arduino IDE)之间的通信

邹嘉荣
2023-03-14

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

我在谷歌上做了一些搜索,阅读了这个例子。。。但我还是没有成功。好的,基本的事情是,我需要连续地通信从Raspberry pi发送到Arduino的串行端口命令。我试图使代码尽可能简单。

最初,我将J char从覆盆子pi(QT C)发送到Arduino(Arduino IDE c),并等待J,以使Arduino上的LED闪烁。但它不工作...连我都没拿到接口的样本

监视器,9600波德

我已经附加了程序,我已经尝试了双方。

主要的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);
 }
}

输出显示:

覆盆子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

共有2个答案

唐增
2023-03-14

您的问题的答案如下所示:

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

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

广宏远
2023-03-14

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

我通常使用readyRead singal或WaitForBytesWrite和WaitForReadReadReady组合。您应该看看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();
}
 类似资料:
  • 我正在尝试通过串行通信来溜冰树莓皮和阿杜伊诺。我的目的是用户控制Raspberry Pi的Arduino LED。 我找到了一个串行通信的示例代码,它每2秒自动向Arduino发送一个字符串。但我想做两件事: 更改发送的值,而不是Hello。 用户可以随时发送值,而不是自动发送。 你能帮我吗?我不擅长节点。js。

  • 我想用Python在我的树莓派和Arduino之间进行交流。到目前为止,Arduino成功地向Raspberry Pi发送了一条串行消息,并使用Python中的ser.readline()函数读取消息。但是当我想用IF语句闪烁连接到树莓派的led时,它就不起作用了 这是我的Arduino代码: 这是在我的Raspberry Pi上运行的Python代码: 这是我在终端中看到的:终端图像 我已经找了

  • 我已经设法从我的arduino(Uno)到我的Raspberry Pi 3,通过串口进行了写操作。 如果我在pi端使用相同的python脚本,在arduino端使用相同的Sketch,但使用Teensy,我无法从Arduino读取任何输出。 根据串行通信,arduino Uno和teensy之间有什么区别吗? Arduino草图: 我的Pi上的Python脚本: 此代码适用于我的Arduino U

  • 我试图建立RaspberryPI B(主)和Arduino Uno(从)之间的全双工SPI通信。 主机侧代码: 从机端码 所以,简单地说,我希望如果我向throw MOSI行发送一个输入(在本例中为7),Arduino会增加var x,并用x的值回复我。 但是我的输出看起来像这样: 换句话说,如果我发送7,Arduino增量x,则在while行中循环并返回相同的输入值。如果我再次发送一个值,Ard

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

  • 我用的是树莓pi 3b杰西发行。我试图更新我的覆盆子,但它给我这个错误: sudo apt-get更新 Get:1 http://archive.raspbian.org jessie InRelease 100% [1 InRelease gpgv 6,893 B]拆分 /var/lib/apt/lists/部分/archive.r Ign http://archive.raspbian.org