我遇到了一个非常简单的问题。
我正在尝试制作一个Qt GUI应用程序,以从GUI控制我的Arduino(而不是从Arduino IDE的串行监视器控制它)。我能够使用QSerialPort Write()方法成功地向Arduino写入,但我无法从Arduino读取任何内容。从串行端口读取数据的唯一方法是在Qt代码的waitForBytesWrite()中的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;
});
我已经尝试了一个多星期通过串行端口从raspberry pi(QT C)到Arduino(Arduino IDE C)进行通信,但一直失败。 我在谷歌上做了一些搜索,阅读了这个例子。。。但我还是没有成功。好的,基本的事情是,我需要连续地通信从Raspberry pi发送到Arduino的串行端口命令。我试图使代码尽可能简单。 最初,我将J char从覆盆子pi(QT C)发送到Arduino(Ar
我正在尝试使用arduino通过串行通信从泼妇软件获取传入数据。并将数据移动到其他12个arduino,如果我将泼妇的通道号保留为43,但我需要控制480个通道,它就可以工作。所以第一个arduino控制43个通道,下一个是44-87,依此类推。 这是我的主代码:'ulusetup(){Serial.begin(9600); }}//输出
我正在尝试通过串行通信来溜冰树莓皮和阿杜伊诺。我的目的是用户控制Raspberry Pi的Arduino LED。 我找到了一个串行通信的示例代码,它每2秒自动向Arduino发送一个字符串。但我想做两件事: 更改发送的值,而不是Hello。 用户可以随时发送值,而不是自动发送。 你能帮我吗?我不擅长节点。js。
我在Raspberry Pi(Python脚本)和Arduino nano/uno之间的串行通信方面遇到一些问题。我的两个设备都通过USB端口连接,当我直接从arduino IDE串行监视器发送命令时,arduino草图始终正确响应: 但是,当我运行python脚本,他发送相同的命令时,草图以随机方式响应。 覆盆子终端: Arduino串行监视器: Mi代码为: Arduino草图: Python
我在一个项目中,我想通过串行通信发送传感器数据从Arduino到PHP。 不幸的是,我无法读取PHP中的串行端口。然而,另一个方向(PHP到Arduino)工作得很好。我使用的是php_系列。班来自Rémy Sanchez的php,由Rizwan Kassim修改。我依赖于readPort()函数。 我在Mac OS X上使用Arduino UNO和Apache WAMP-Server。我应该实现
我对Arduino和Processing都比较陌生,我一直在开发一种利用两者之间串行通信的代码。我的Arduino代码从压电传感器读取并打印数值,然后将数值发送给Processing,Processing根据数值绘制特定形状。该代码以前已经工作过,但由于某种原因,它不再工作。一切都会编译,但当我运行处理代码时,草图窗口是空的,并且仍然是空的。有几次“错误,禁用serialEvent()”出现了,但