使用UART RS232C的QT串行通信



我想使用 uart Cable(RS232C)在Linux中连接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();
     }

首先,不能保证您的设备将始终连接到/dev/ttyusb0,因此您最好通过qserialportinfo使用参数搜索您的设备QString制造商()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();
}

mainwindow.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

接下来检查您的产品制造商或序列号,然后在此处设置。
另外,您需要单独的处理程序,就像我创建的readSerialLdata一样,收到的数据
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设备,只需实现插槽并调用方法:

mSerialPort->write("Some command");

相关内容

  • 没有找到相关文章

最新更新