2017-09-08 4 views
0

Ich möchte qt und ein Gerät mit UART-Kabel (RS232C) in Linux verbinden.Qt serielle Kommunikation mit UART RS232C

Ich schreibe Code, macht ui und funktioniert, aber es funktioniert nicht.

Ich möchte verbinden, wenn ich auf eine Schaltfläche (ui) Gerät einschalten und verbinden.

Auch ich möchte eine Funktion machen, die, wenn ich ein Befehlsgerät eingeben wird erkennen und ausführen.

Unten ist mein Code, jemand mir bitte helfen.

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

Antwort

1

Zunächst einmal ist es nicht, dass das Gerät wird immer auf/dev/ttyUSB0 verbunden ist garantiert so you'l bessere Suche für Ihr Gerät von QSerialPortInfo mit dem Parameter QString Hersteller() const oder quint16 Product() const oder QString serialNumber() const.

Auch Sie erstellen zu viele QSerialPort und nicht damit umgehen. Erstelle nur einen.

Hier ist ein Beispielcode:

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 

nächstes überprüfen Sie Ihre Ihre Produkthersteller oder Seriennummer und hier eingestellt.
Auch müssen Sie separate Handler für empfangene Daten, wie ich 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(); 
} 

letztere erstellt, wenn Sie einige Daten zu Ihrem UART-Gerät nur implemente Slot und Call-Methode senden möchten:

mSerialPort->write("Some command"); 
+0

danke für Ihre Antwort. Wie Sie mir geraten haben, habe ich den Code geschrieben. aber wenn ich den "connect" -Button vorbehalte, merkt sich das an. Wie kann ich Geräte verbinden oder nicht? Und das letzte, was du gesagt hast "mSerialPort-> write (" Some command ");" wie implementieren? Ich habe den Code und das Kommando einzeln geschrieben? – kararara

+0

Wenn Sie auf connect drücken, wird nur die Verbindung mit dem Gerät gestartet und versucht, Daten von der seriellen Schnittstelle zu lesen. Wenn vom Gerät keine Daten gesendet werden, sehen Sie nichts. Wenn Sie überprüfen möchten, ob das Gerät verbunden ist, rufen Sie einfach isOpen() auf (mSerialPort-> isOpen()). –

+0

Um Daten an das Gerät zu senden, erstellen Sie eine neue Schaltfläche, zum Beispiel senden, so dass Sie Slot void MainWindow :: on_pushButton_send_clicked() {mSerialPort-> schreiben ("Einige Befehl");} –