C++ 为什么我从串行端口读取垃圾?
我试图获取串行数据并将其显示在GUI上,这是我在QT中制作的,当我试图获取串行数据并将其显示在输出中时,它会显示这个垃圾类型的值。 “?\u0004?\u0004???\u0004?\u0004?\u001C??” “?\u0004?#\u0004???\u0004?#\u001C???\u0004?#\u001C” 下面是完整的代码,但罪魁祸首是最后一行中的“readserial”函数C++ 为什么我从串行端口读取垃圾?,c++,qt,arduino,C++,Qt,Arduino,我试图获取串行数据并将其显示在GUI上,这是我在QT中制作的,当我试图获取串行数据并将其显示在输出中时,它会显示这个垃圾类型的值。 “?\u0004?\u0004???\u0004?\u0004?\u001C??” “?\u0004?#\u0004???\u0004?#\u001C???\u0004?#\u001C” 下面是完整的代码,但罪魁祸首是最后一行中的“readserial”函数 #include "dialog.h" #include "ui_dialog.h" #include
#include "dialog.h"
#include "ui_dialog.h"
#include <QSerialPort>
#include<string>
#include<QDebug>
#include<QMessageBox>
#include <QSerialPortInfo>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
ui->label->setText("0");
arduino = new QSerialPort(this);
serialBuffer = "";
bool arduino_is_availabe = false;
QString arduino_uno_port_name;
foreach(const QSerialPortInfo &serialPortInfo, QSerialPortInfo::availablePorts())
{
if(serialPortInfo.hasProductIdentifier() && serialPortInfo.hasVendorIdentifier())
{
if((serialPortInfo.productIdentifier() == arduino_uno_product_id) && (serialPortInfo.vendorIdentifier() == arduino_uno_vendor_id))
{
arduino_is_availabe = true;
arduino_uno_port_name = serialPortInfo.portName();
}
}
}
if(arduino_is_availabe)
{
qDebug() <<"Found the arduino port...\n";
arduino->setPortName(arduino_uno_port_name);
arduino->open(QSerialPort::ReadOnly);
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setBaudRate(QSerialPort::Data8);
arduino->setFlowControl(QSerialPort::NoFlowControl);
arduino->setParity(QSerialPort::NoParity);
arduino->setStopBits(QSerialPort::OneStop);
QObject::connect(arduino, SIGNAL(readyRead()), this, SLOT(readSerial()));
}else
{
qDebug() <<"Couldn't find the correct port for the arduino.\n";
QMessageBox::information(this, "serial port error", "couldn't open the serial port to arduino ");
}
}
Dialog::~Dialog()
{
if(arduino->isOpen())
{
arduino->close(); // Close the serial port if it's open.
}
delete ui;
}
void Dialog::readSerial()
{
QByteArray serialData;
serialData=arduino->readAll();
serialBuffer+=QString::fromStdString(serialData.toStdString());
qDebug()<<serialBuffer;
}
void Dialog::on_label_linkActivated(const QString &link)
{
ui->label->setText(serialBuffer);
}
#包括“dialog.h”
#包括“ui_dialog.h”
#包括
#包括
#包括
#包括
#包括
Dialog::Dialog(QWidget*父项):
QDialog(父级),
ui(新建ui::对话框)
{
用户界面->设置用户界面(此);
用户界面->标签->设置文本(“0”);
arduino=新的QSerialPort(本);
serialBuffer=“”;
布尔·阿杜伊诺可用=假;
QString arduino_uno_港口名称;
foreach(常量QSerialPortInfo和serialPortInfo,QSerialPortInfo::availableport())
{
if(serialPortInfo.hasProductIdentifier()&&serialPortInfo.hasVendorIdentifier())
{
if((serialPortInfo.productIdentifier()==arduino\u uno\u产品id)和&(serialPortInfo.vendorIdentifier()==arduino\u uno\u供应商id))
{
arduino_可用=真;
arduino_uno_port_name=serialPortInfo.portName();
}
}
}
如果(arduino可用)
{
qDebug()打开(QSerialPort::ReadOnly);
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setBaudRate(QSerialPort::Data8);
arduino->setFlowControl(QSerialPort::NoFlowControl);
arduino->setParity(QSerialPort::NoParity);
arduino->setStopBits(QSerialPort::OneStop);
连接(arduino,信号(readyRead()),此,插槽(readSerial());
}否则
{
qDebug()close();//如果串行端口打开,请将其关闭。
}
删除用户界面;
}
void Dialog::readSerial()
{
QByteArray串行数据;
serialData=arduino->readAll();
serialBuffer+=QString::fromStdString(serialData.tostString());
qDebug()setText(serialBuffer);
}
我想你的问题就在这里:
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setBaudRate(QSerialPort::Data8);
您连续两次设置波特率,这毫无意义。在第二行中,您将设置一个值QSerialPort::Data8,因此您可能试图定义setDataBits方法。它看起来是这样的:
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setDataBits(QSerialPort::Data8);
显示您的.ino.change
serialBuffer+=QString::fromStdString(serialData.toststring())代码>到serialBuffer+=serialData代码>。QByteArray将自动转换为QString。