Qt5 串口通信

帮朋友写个简单的Qt上位程序,串口通信,传输ASCII码,先要求打开一个TXT文件收到下位的"/"开始把TXT文件中的内容发送到下位,遇到TXT文件中的";"停止发送,下次发送
的时候继续发送。
首先在pro文件中加上QT	+=serialport 保存 																    
ui如下:
下面是头文件:
#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 Read_Data();

        void on_openserial_clicked();

        void on_openfile_clicked();

private:
    Ui::MainWindow *ui;
    QSerialPort *serial;
};

#endif // MAINWINDOW_H
下面是cpp文件中的内容

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->BaudBox->addItem("9600");
    ui->BaudBox->addItem("19200");
    ui->BaudBox->addItem("38400");
    ui->BaudBox->addItem("57600");
    ui->BaudBox->addItem("115200");
    ui->BitNumBox->addItem("5");
    ui->BitNumBox->addItem("6");
    ui->BitNumBox->addItem("7");
    ui->BitNumBox->addItem("8");
    ui->StopBox->addItem("1");
    ui->ParityBox->addItem("0");
    ui->openserial->setEnabled(false);
    serial = new QSerialPort;
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        QSerialPort serial1;
        serial1.setPort(info);
        if(serial1.open(QIODevice::ReadWrite))
        {
            ui->PortBox->addItem(serial1.portName());
            serial1.close();
        }
        ui->BaudBox->setCurrentIndex(0);
        ui->BitNumBox->setCurrentIndex(3);
        qDebug()<"界面设置成功");
    }
}

MainWindow::~MainWindow()
{
    delete ui;

}

void MainWindow::on_openserial_clicked()
{

    if(ui->openserial->text()==tr("打开串口"))
    {
        serial->setPortName(ui->PortBox->currentText());
        if(!serial->open(QIODevice::ReadWrite))
        {
            qDebug()<"打开失败");
        }
        serial->setBaudRate(ui->BaudBox->currentText().toInt());
        switch(ui->BitNumBox->currentIndex())
        {
            case 0:serial->setDataBits(QSerialPort::Data5);break;
            case 1:serial->setDataBits(QSerialPort::Data6);break;
            case 2:serial->setDataBits(QSerialPort::Data7);break;
            case 3: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 0: serial->setStopBits(QSerialPort::OneStop); break;
              case 1: 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->openserial->setText(tr("关闭串口"));
        QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
    }
    else
    {
        serial->clear();
        serial->close();

        ui->PortBox->setEnabled(true);
        ui->BaudBox->setEnabled(true);
        ui->BitNumBox->setEnabled(true);
        ui->ParityBox->setEnabled(true);
        ui->StopBox->setEnabled(true);
        ui->openserial->setText(tr("打开串口"));
    }


}

void MainWindow::Read_Data()
{
    QByteArray buf;
    buf = serial->readAll();
    if(buf.contains("/"))
    {
        QString str1 = ui->StextEdit->toPlainText();			//1            1,7,8,9目的是将 QString 转为char*,因为write函数不接受QString作为参数
        int a;								//2									
        a=str1.indexOf(";");						//3
        QString str2=str1.mid(0,a);					//4            2,3,4,5,6是将第一个分号找出来将之前的内容传递给下位,并将剩余部
        str1=str1.right(str1.length()-a-1);				//5            分截取出来重新赋值给StextEdit部件显示
        ui->StextEdit->setText(str1);					//6
        char* ch;							//7
        QByteArray ba = str2.toLatin1();				//8
        ch=ba.data();							//9
        serial->write(ch);						


    }
    if(!buf.isEmpty())
    {
        QString str = ui->textEdit->toPlainText();
        str+=tr(buf);
        ui->textEdit->clear();
        ui->textEdit->append(str);
    }
    buf.clear();
}
void MainWindow::on_openfile_clicked()
{
    QString filename=QFileDialog::getOpenFileName(this,tr("Open File"),".",tr("Text files (*.txt)"));
    if(!filename.isEmpty())
    {
        QFile file(filename);
        if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
        {
            QMessageBox::warning(this,tr("Read File"),tr("Can not open file:\n%1").arg(filename));
             return;
        }
        QTextStream in(&file);
        ui->StextEdit->setText(in.readAll());
        file.close();
        ui->openserial->setEnabled(true);
    }
    else
    {
        QMessageBox::warning(this,tr("filename"),tr("You did not select any file"));
    }
}


             

 








你可能感兴趣的:(Qt)