Linux 使用UART RS232C的Qt串行通信
我想在linux中使用UART电缆(RS232C)连接qt和设备 我正在编写代码、制作ui和操作,但它不起作用 我想在单击某个按钮(ui)设备打开并连接时进行连接 此外,我想做一个功能,如果我输入一些命令设备将识别和执行 下面是我的密码,请有人帮我Linux 使用UART RS232C的Qt串行通信,linux,qt,serial-port,uart,Linux,Qt,Serial Port,Uart,我想在linux中使用UART电缆(RS232C)连接qt和设备 我正在编写代码、制作ui和操作,但它不起作用 我想在单击某个按钮(ui)设备打开并连接时进行连接 此外,我想做一个功能,如果我输入一些命令设备将识别和执行 下面是我的密码,请有人帮我 <mainwindow.cpp> #include "mainwindow.h" #include "ui_mainwindow.h" #include <QtSerialPort/QSerialPort> #include
<mainwindow.cpp>
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSerialPort/QSerialPort>
#include <QMessageBox>
#include <QObject>
#include <QIODevice>
#include <QDebug>
QSerialPort serial;
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
QSerialPort*port=new QSerialPort();
port->setPortName("/dev/ttyUSB0");
port->setBaudRate(QSerialPort::Baud19200);
port->setDataBits(QSerialPort::Data8);
port->setParity(QSerialPort::NoParity);
port->setStopBits(QSerialPort::OneStop);
port->setFlowControl(QSerialPort::NoFlowControl);
port->open(QIODevice::ReadWrite);
ui->setupUi(this);
serial = new QSerialPort(this);
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::on_pushButton_connect_clicked()
{
port=new QSerialPort();
QObject::connect(port,SIGNAL(readyRead()),this,
SLOT(on_pushButton_connect_clicked()));
if(!port->open(QIODevice::ReadWrite)){
QMessageBox::information(this, tr("connect"),
"serialcommunication start");
}
else
{
QMessageBox::critical(this, tr("fail"), serial-
>errorString());
}
}
void MainWindow::on_pushButton_disconnect_clicked()
{
port->close();
QMessageBox::information(this, tr("disconnect"), "serial
communication end");
}
<mainwindow.h>
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QMessageBox>
#include <QIODevice>
#include <QDebug>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
QSerialPort*serial; //plus
QSerialPort*port;
QWidget*main_widget;
void readData();
~MainWindow();
private slots:
void on_pushButton_connect_clicked();
void on_pushButton_disconnect_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
<main.cpp>
#include "mainwindow.h"
#include <QApplication>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QMessageBox>
#include <QIODevice>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
foreach(const QSerialPortInfo
&info,QSerialPortInfo::availablePorts()){
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite))
serial.close();
}
MainWindow w;
w.show();
return a.exec();
}
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
#包括
#包括
#包括
QSerialPort系列;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
QSerialPort*端口=新的QSerialPort();
端口->设置端口名(“/dev/ttyUSB0”);
端口->设置波特率(QSerialPort::Baud19200);
端口->设置数据位(QSerialPort::Data8);
端口->设置奇偶校验(QSerialPort::NoParity);
端口->设置停止位(QSerialPort::OneStop);
端口->设置流量控制(QSerialPort::NoFlowControl);
端口->打开(QIODevice::ReadWrite);
用户界面->设置用户界面(此);
串行=新的QSerialPort(本);
}
MainWindow::~MainWindow()
{
删除用户界面;
}
void主窗口::在按钮上点击连接
{
端口=新的QSerialPort();
QObject::connect(端口,信号(readyRead()),此,
插槽(在按钮上单击连接());
如果(!端口->打开(QIODevice::ReadWrite)){
QMessageBox::信息(this,tr(“connect”),
“串行通信启动”);
}
其他的
{
QMessageBox::critical(this,tr(“fail”),串行-
>errorString());
}
}
无效主窗口::在按钮上断开连接
{
端口->关闭();
QMessageBox::信息(此,tr(“断开”),“串行
通讯终端);;
}
#ifndef主窗口
#定义主窗口
#包括
#包括
#包括
#包括
#包括
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
公众:
显式主窗口(QWidget*parent=0);
QSerialPort*串行;//加
QSerialPort*端口;
QWidget*主_小部件;
void readData();
~main窗口();
专用插槽:
单击按钮连接时无效();
按下按钮时无效,断开按钮();
私人:
Ui::MainWindow*Ui;
};
#endif//main窗口
#包括“mainwindow.h”
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
foreach(常量QSerialPortInfo
&信息,QSerialPortInfo::AvailableReports()){
QSerialPort系列;
串行设置端口(信息);
if(serial.open(QIODevice::ReadWrite))
serial.close();
}
主窗口w;
w、 show();
返回a.exec();
}
首先,不能保证您的设备始终连接到/dev/ttyUSB0,因此您最好通过带参数的QSerialPortInfo搜索您的设备
QString manufacturer()常量或quint16 productIdentifier()常量或QString serialNumber()常量
此外,您正在创建太多的QSerialPort,并且无法处理它。只创建一个
以下是示例代码:
main.cpp
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
谢谢你的回复。正如您所建议的,我编写了代码。但如果我按下“连接”按钮,什么也没发生。我如何知道设备是否连接?上一次你说“mSerialPort->write(“somecommand”);“如何实现?”?我一个接一个地编写了代码和命令?当您按下connect时,它只是开始与设备连接,并试图从串行端口读取数据。若并没有数据从设备发出,你们将什么也看不到。如果您想检查设备是否已连接,只需调用isOpen()(mSerialPort->isOpen())。要将数据发送到设备,请创建新按钮,例如send,这样您将拥有插槽void main window::on_button_send_clicked(){mSerialPort->write(“Some command”);}谢谢您的回复。我添加代码并执行。但在应用程序输出中“未找到连接的设备”。我认为qt与设备没有连接。我如何解决这个问题?如果(item.manufacturer()=“您的产品”)-您的产品是什么?如果您不知道,只需添加qDebug()
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
class QSerialPort;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private slots:
//! Receives all the data from serial port
void readSerialData();
void on_pushButton_connect_clicked();
void on_pushButton_disconnect_clicked();
private:
Ui::MainWindow *ui;
QSerialPort *mSerialPort;
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QMessageBox>
#include <QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow),
mSerialPort{new QSerialPort}
{
ui->setupUi(this);
mSerialPort->setBaudRate(QSerialPort::Baud19200);
mSerialPort->setDataBits(QSerialPort::Data8);
mSerialPort->setParity(QSerialPort::NoParity);
mSerialPort->setStopBits(QSerialPort::OneStop);
mSerialPort->setFlowControl(QSerialPort::NoFlowControl);
connect(mSerialPort, SIGNAL(readyRead()), this, SLOT(readSerialData()));
}
MainWindow::~MainWindow()
{
delete mSerialPort;
delete ui;
}
void MainWindow::readSerialData()
{
QByteArray lTmpBA;
lTmpBA = mSerialPort->readAll();
qDebug() << "Received data: " << lTmpBA;
}
void MainWindow::on_pushButton_connect_clicked()
{
foreach(QSerialPortInfo item, QSerialPortInfo::availablePorts()) {
if (item.manufacturer() == "Your product") { //past your manufacturer here
mSerialPort->setPort(item);
if(!mSerialPort->open(QIODevice::ReadWrite)){
QMessageBox::information(this, tr("connect"),
"serialcommunication start");
} else {
QMessageBox::critical(this, tr("fail"), mSerialPort->errorString());
}
} else {
qDebug() << "No connected device found";
}
}
}
void MainWindow::on_pushButton_disconnect_clicked()
{
mSerialPort->close();
}
mSerialPort->write("Some command");