2017-09-08 1 views
0

리눅스에서 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가 너무 많아서 처리하지 못합니다. 하나만 만듭니다.

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

답장을 보내 주셔서 감사합니다. 당신이 조언 한대로, 나는 코드를 썼다. 하지만 만약 내가 "연결"버튼을 preess, happing 지적. 장치 연결 여부를 어떻게 알 수 있습니까? 마지막으로 "mSerialPort-> write ("일부 명령 ");" 어떻게 구현합니까? 나는 코드와 명령을 하나씩 썼다. – kararara

+0

연결을 누르면 장치와의 연결이 시작되고 직렬 포트에서 데이터를 읽으려고합니다. 장치에서 데이터가 방출되지 않으면 아무 것도 볼 수 없습니다. 장치가 연결되어 있는지 확인하려면 isOpen() (mSerialPort-> isOpen())을 호출하십시오. –

+0

장치에 데이터를 보내려면 새 버튼을 만드십시오. 예를 들어 보냅니다. 슬롯 무효가됩니다. MainWindow :: on_pushButton_send_clicked() {mSerialPort-> write ("Some command");} –