Linux 使用UART RS232C的Qt串行通信

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

我想在linux中使用UART电缆(RS232C)连接qt和设备

我正在编写代码、制作ui和操作,但它不起作用

我想在单击某个按钮(ui)设备打开并连接时进行连接

此外,我想做一个功能,如果我输入一些命令设备将识别和执行

下面是我的密码,请有人帮我

<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");