我已经尝试了一个多星期通过串行端口从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
您的问题的答案如下所示:
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 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