2017-09-08 172 views
0

linuxのUARTケーブル(RS232C)を使用してqtとデバイスを接続します。UART RS232Cを使用したQtシリアル通信

私はコードを書いて、UIを作成していますが、動作しません。

私はいくつかのボタン(ui)デバイスをオンにして接続するときに接続したいと思います。

また、私はいくつかのコマンドを入力してデバイスが認識して実行する機能を作りたいと思っています。

以下は私のコードです。誰か助けてください。

あなたのデバイスは常には/ dev/ttyUSB0に接続されることが保証されていないすべての
<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(); 
    } 

答えて

1

まずyou'lので、パラメータ QStringのメーカー()constはまたはquint16 productIdentifierとQSerialPortInfoによってあなたのデバイスのためのより良い検索() constまたはQString serialNumber()const。

また、作成しているQSerialPortが多すぎるため、処理できません。 1つだけ作成してください。ここで

はサンプルコードです:

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 

次はあなたのあなたの製品のメーカーまたはシリアル番号を確認し、ここで設定しました。

mSerialPort->write("Some command"); 
:私はあなたのUARTデバイスにだけimplementeスロットと呼び出し方法をいくつかのデータを送信する場合は

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

後者readSerialData
mainwindows.cppを作成したよう
はまた、あなたは、受信したデータのために別々のハンドラを必要とします

+0

ご返信ありがとうございます。あなたがアドバイスしたように、私はコードを書いた。しかし、もし私が "接続"ボタンを押すことを覚えていれば、不自然なことに気づくでしょう。どのようにデバイスの接続を知ることができますか?最後にあなたは "mSerialPort-> write(" Some command ");"どのように実装?私はコードとコマンドを1つずつ書きましたか? – kararara

+0

接続を押すと、デバイスとの接続が開始され、シリアルポートからデータを読み取ろうとしています。デバイスからデータが放出されない場合、何も表示されません。デバイスが接続されているかどうかを確認するには、isOpen()(mSerialPort-> isOpen())を呼び出します。 –

+0

デバイスにデータを送信するには、新しいボタンを作成します。たとえば、sendを入力します。スロットは無効になります。MainWindow :: on_pushButton_send_clicked(){mSerialPort-> write( "Some command");} –

関連する問題