Qtのシリアル送受信データ
6797 ワード
参考:http://blog.csdn.net/u014695839/article/details/50611549
参考:http://blog.csdn.net/zbw1185/article/details/51496663
何日間も勉強して、やっとシリアル通信のための上位機ができました.これからシリアル類の使用について紹介します.
まず、QT 5はQSerialPortという種類を持っています.使う時はプロファイルに一行を追加する必要があります.
QT += serialport
それから直接引用先のファイルを使ってもいいです.
QSerialPortInfo:システムに存在するシリアルポートの情報を提供します.
次にQSerialPortのオブジェクトを作成し、シリアルの名前、ポートレート、データビット、チェックビット、ストップビットなどのパラメータを設定してからシリアル読みと書き込みを行います.大体まとめました.設定、読み、書く過程です.
一、設定(例)
二、データの読み込み
三、データ送信
シリアルを使うと上記のステップだけで、使用後は実行する必要があります.
コードは以下の通りです
もう何回もダウンロードされましたが、コメントの中の仲間がいくつかの小さな問題を提出しましたので、もう更新しました.またバージョン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
以上のプログラムに問題があったら、すぐに注意してください.必ず訂正します.
皆さんが勉強している間にお互いに交流してほしいです.文章に間違いがあれば、指摘してください.
参考: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
以上のプログラムに問題があったら、すぐに注意してください.必ず訂正します.
皆さんが勉強している間にお互いに交流してほしいです.文章に間違いがあれば、指摘してください.