【问题标题】:Qt serial communication using UART RS232C使用 UART RS232C 的 Qt 串行通信
【发布时间】:2017-09-08 00:14:52
【问题描述】:

我想在 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();
     }

【问题讨论】:

    标签: linux qt serial-port uart


    【解决方案1】:

    首先,不能保证您的设备将始终连接到 /dev/ttyUSB0,因此您最好通过带有参数的 QSerialPortInfo 搜索您的设备 QString Manufacturer() const 或 quint16 productIdentifier() const 或 QString serialNumber() const。

    另外,您创建了太多 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();
    }
    

    主窗口.h

    #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
    

    接下来检查您的产品制造商或序列号并在此处设置。
    您还需要单独的处理程序来接收数据,例如我创建的 readSerialData
    mainwindows.cpp

    #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();
    }
    

    如果你想发送一些数据到你的 UART 设备,只需实现 slot 和 call 方法:

    mSerialPort->write("Some command");
    

    【讨论】:

    • 感谢您的回复。正如您所建议的,我编写了代码。但如果我按下“连接”按钮,注意到已经发生了。我怎么知道设备连接与否?最后你说“mSerialPort->write("Some command");”如何实施?代码和命令我一一写?
    • 当您按下连接时,它只是开始与设备连接并尝试从串行端口读取数据。如果设备没有发出任何数据,您将什么也看不到。如果您想检查设备是否已连接,只需调用 isOpen() (mSerialPort->isOpen())。
    • 要将数据发送到设备创建新按钮,例如发送,因此您将拥有插槽 void MainWindow::on_pushButton_send_clicked() {mSerialPort->write("Some command");}
    • 感谢您的回复。我添加代码并执行。但是在应用程序输出中“找不到连接的设备”。我认为 qt 与设备没有连接。我该如何解决这个问题??
    • if (item.manufacturer() == "Your product") - 你的产品是什么?如果您不知道,只需添加 qDebug()
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-24
    • 1970-01-01
    • 2021-03-25
    • 2016-07-09
    • 2013-03-28
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多