Qtのシリアル送受信データ

6797 ワード

参考:http://blog.csdn.net/u014695839/article/details/50611549
参考:http://blog.csdn.net/zbw1185/article/details/51496663
何日間も勉強して、やっとシリアル通信のための上位機ができました.これからシリアル類の使用について紹介します.
まず、QT 5はQSerialPortという種類を持っています.使う時はプロファイルに一行を追加する必要があります.
QT      += serialport
それから直接引用先のファイルを使ってもいいです.
#include   
#include  
QSerialPort:シリアルにアクセスする機能を提供します. 
QSerialPortInfo:システムに存在するシリアルポートの情報を提供します.
次にQSerialPortのオブジェクトを作成し、シリアルの名前、ポートレート、データビット、チェックビット、ストップビットなどのパラメータを設定してからシリアル読みと書き込みを行います.大体まとめました.設定、読み、書く過程です.
一、設定(例)
QSerialPort *serial = new QSerialPort;  
//       
serial->setPortName(name);  
//      
serial->open(QIODevice::ReadWrite);  
//       
serial->setBaudRate(BaudRate);  
//        
serial->setDataBits(QSerialPort::Data8);  
 //        
 serial->setParity(QSerialPort::NoParity);   
//       
serial->setStopBits(QSerialPort::OneStop);  
//       
serial->setFlowControl(QSerialPort::NoFlowControl); 
ここではシリアル名をnameとして設定し、シリアルポートを開けて、読み書きができるように設定します.ボーレートはBaudRate、データビットは8ビットで、パリティビットがなく、停止ビットは1ビットで、フロー制御がありません.これらを設定したら読み書きができます.新米として、Qt Creatorの中でキーワードを選択することができますか?F 1を押して文書の種類、関数などのデータを見るマニュアルを開きます.
二、データの読み込み
void MainWindow::Read_Data()  
{  
    QByteArray buf;  
    buf = serial->readAll();  
}  
シリアルがデータを受信し、受信が完了すると、readyRead()の信号が出ますので、スロット関数Read(u)を作成する必要があります.Data()は、信号スロットを設定し、スロット関数において、受信したデータをReadAll()を使用して、bufに読み出す.
三、データ送信
serial->write(data);  
write関数を使って文字列dataを1バイトずつ送信できます.
シリアルを使うと上記のステップだけで、使用後は実行する必要があります.
serial->close();
シリアルを閉じることができます.私はuiインターフェース設計を使って上位機を作成しました.インターフェースは以下の通りです.

コードは以下の通りです
//mianwindow.h  
#ifndef MAINWINDOW_H  
#define MAINWINDOW_H  
#include   
#include   
#include   
#include   
namespace Ui {  
class MainWindow;  
}  
class MainWindow : public QMainWindow  
{  
    Q_OBJECT  
public:  
    explicit MainWindow(QWidget *parent = 0);  
    ~MainWindow();  
private slots:  
    void on_clearButton_clicked();  
    void on_sendButton_clicked();  
    void on_openButton_clicked();  
    void Read_Data();  
private:  
    Ui::MainWindow *ui;  
    QSerialPort *serial;  
};  
#endif // MAINWINDOW_H  
//mainwindow.c  
#include "mainwindow.h"  
#include "ui_mainwindow.h"  
  
MainWindow::MainWindow(QWidget *parent) :  
    QMainWindow(parent),  
    ui(new Ui::MainWindow)  
{  
    ui->setupUi(this);  
    //         
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())  
    {  
        QSerialPort serial;  
        serial.setPort(info);  
        if(serial.open(QIODevice::ReadWrite))  
        {  
            ui->PortBox->addItem(serial.portName());  
            serial.close();  
        }  
    }  
    //                  
    ui->BaudBox->setCurrentIndex(3);  
    //           
    ui->sendButton->setEnabled(false);  
    qDebug() << tr("      !");  
}  
MainWindow::~MainWindow()  
{  
    delete ui;  
}  
//        
void MainWindow::on_clearButton_clicked()  
{  
    ui->textEdit->clear();  
}  
//      
void MainWindow::on_sendButton_clicked()  
{  
    serial->write(ui->textEdit_2->toPlainText().toLatin1());  
}  
//          
void MainWindow::Read_Data()  
{  
    QByteArray buf;  
    buf = serial->readAll();  
    if(!buf.isEmpty())  
    {  
        QString str = ui->textEdit->toPlainText();  
        str+=tr(buf);  
        ui->textEdit->clear();  
        ui->textEdit->append(str);  
    }  
    buf.clear();  
}  
void MainWindow::on_openButton_clicked()  
{  
    if(ui->openButton->text()==tr("    "))  
    {  
        serial = new QSerialPort;  
        //       
        serial->setPortName(ui->PortBox->currentText());  
        //      
        serial->open(QIODevice::ReadWrite);  
        //       
        serial->setBaudRate(ui->BaudBox->currentText().toInt());  
        //        
        switch(ui->BitNumBox->currentIndex())  
        {  
        case 8: serial->setDataBits(QSerialPort::Data8); break;  
        default: break;  
        }  
        //        
        switch(ui->ParityBox->currentIndex())  
        {  
        case 0: serial->setParity(QSerialPort::NoParity); break;  
        default: break;  
        }  
        //       
        switch(ui->StopBox->currentIndex())  
        {  
        case 1: serial->setStopBits(QSerialPort::OneStop); break;  
        case 2: serial->setStopBits(QSerialPort::TwoStop); break;  
        default: break;  
        }  
        //       
        serial->setFlowControl(QSerialPort::NoFlowControl);  
        //          
        ui->PortBox->setEnabled(false);  
        ui->BaudBox->setEnabled(false);  
        ui->BitNumBox->setEnabled(false);  
        ui->ParityBox->setEnabled(false);  
        ui->StopBox->setEnabled(false);  
        ui->openButton->setText(tr("    "));  
        ui->sendButton->setEnabled(true);  
        //       
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);  
    }  
    else  
    {  
        //      
        serial->clear();  
        serial->close();  
        serial->deleteLater();  
        //        
        ui->PortBox->setEnabled(true);  
        ui->BaudBox->setEnabled(true);  
        ui->BitNumBox->setEnabled(true);  
        ui->ParityBox->setEnabled(true);  
        ui->StopBox->setEnabled(true);  
        ui->openButton->setText(tr("    "));  
        ui->sendButton->setEnabled(false);  
    }  
} 
//main.c  
#include "mainwindow.h"  
#include   
int main(int argc, char *argv[])  
{  
    QApplication a(argc, argv);  
    MainWindow w;  
    w.show();  
    return a.exec();  
}  
プロジェクトファイルはここでダウンロードできます.
もう何回もダウンロードされましたが、コメントの中の仲間がいくつかの小さな問題を提出しましたので、もう更新しました.またバージョン2にアップロードしました.
http://download.csdn.net/detail/u014695839/9423213
バージョン2:mysthread.hとmysthread.cとコードの中の余分な芫include“mysthread.h”を削除して、ReadをData()スロット関数のif(buf!=NULL)はif(!buf.isEmpty()に変更されました.
http://download.csdn.net/detail/u014695839/9763670
以上のプログラムに問題があったら、すぐに注意してください.必ず訂正します.
皆さんが勉強している間にお互いに交流してほしいです.文章に間違いがあれば、指摘してください.