基於QT5.13 的串口通信例程

廢話不多說直接上圖,   其中包含系統時間獲取顯示  ;以及網址鏈接跳轉功能

串口開開啓以及顯示及發送方式;串口號是自動查詢。所以選擇好波特率就能使用,上圖是我與stm8單片機通訊的示例,按照通訊協議單片機按照通訊協議回覆。

下面是.h源程序:.h

#ifndef PORT_H
#define PORT_H

#include <QDialog>
#include <QSerialPort>
#include <QLabel>
QT_BEGIN_NAMESPACE
namespace Ui { class port; }
QT_END_NAMESPACE

class port : public QDialog
{
    Q_OBJECT

public:
    port(QWidget *parent = nullptr);
    ~port();//釋放
public:
    bool portconfig(void);

private slots:
    void on_CBoxSerialport_currentIndexChanged(const QString &arg1);
    void on_Btnopen_clicked();

    void on_BtnSend_clicked();
    void on_SerialPort_readyRead();
    void on_pushButton_clicked();
    void time_update();

    void on_BtnCleanRecv_clicked();

    void on_btnweb_clicked();
    QByteArray GetHexValue(QString str);
    char ConvertHexChar(char ch);
    void WriteMyCom();

private:
    Ui::port *ui;
    QSerialPort comport;
    QSerialPort gloabal_port;
    bool mIsOpen;
    QString mpotName;
    QString mbaurate;
    QString mparity;
    QString mdatabits;
    QString mstopbits;
    QLabel *currenTimLabel;


};
#endif // PORT_H

下面是.pp源碼:

#include "port.h"
#include "ui_port.h"
#include "QDebug"
#include "QSerialPortInfo"
#include "QList"
#include <QLabel>
#include <QDateTime>
#include <QString>
#include <QTime>
#include <QTimer>
#include <QDate>
#include <QUrl>
#include <QDesktopServices>
port::port(QWidget *parent)
    : QDialog(parent)
    , ui(new Ui::port)
{
    ui->setupUi(this);//佈局設置到port中
    mIsOpen = false;
    ui->BtnSend->setEnabled(mIsOpen);
  /*  ui->CBoxSerialport->addItem("COM1");
    ui->CBoxSerialport->addItem("COM2");
    ui->CBoxSerialport->addItem("COM3");
    comport.setPortName("COM4");
    comport.setBaudRate(QSerialPort::Baud38400);
*/
    //自動查找已有串口
    QList<QSerialPortInfo> serilPortInfo = QSerialPortInfo::availablePorts();
    int count = serilPortInfo.count();
    for (int i = 0;i < count; i++) {
        ui->CBoxSerialport->addItem(serilPortInfo.at(i).portName());
    }
    connect(&comport,&QSerialPort::readyRead,this,&port::on_SerialPort_readyRead); //接收函數觸發
    //設置定時器
    QTimer *timer = new QTimer(this);
    timer->start(1000);   //每隔1000ms發送timeout的信號
    connect(timer,SIGNAL(timeout()),this,SLOT(time_update()));

    //獲取日期時間並格式化    //可以不用
    QDate::currentDate().toString("yyyy-MM-dd");
    QTime::currentTime().toString("HH:mm:ss");
    QTime::currentTime().toString("HH:mm:ss zzz");
    QDateTime::currentDateTime().toString("yyyy-MM-DD HH:mm:ss");
    QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss:zzz");
   // ui->btnweb->setText("百度");

}
port::~port()
{
    delete ui;
}
//串口初始化
bool port::portconfig()
{
    //獲取配置
    mpotName = ui->CBoxSerialport->currentText();
    mbaurate = ui->CBoxBaudrate->currentText();
    mparity = ui->CBoxParity->currentText();
    mdatabits = ui->CBoxDatabits->currentText();
    mstopbits = ui->CBoxStopBits->currentText();
    //設置配置
    comport.setPortName(mpotName);
    if("9600" == mbaurate)
    {
        comport.setBaudRate(QSerialPort::Baud9600);
    }
    if("19200" == mbaurate)
    {
        comport.setBaudRate(QSerialPort::Baud19200);
    }
    if("38400" == mbaurate)
    {
        comport.setBaudRate(QSerialPort::Baud38400);
    }
    if("57600" == mbaurate)
    {
        comport.setBaudRate(QSerialPort::Baud57600);
    }
    if("115200" == mbaurate)
    {
        comport.setBaudRate(QSerialPort::Baud115200);
    }
    if("NONE" == mparity)
    {
        comport.setParity(QSerialPort::NoParity);
    }else if ("ODD" == mparity)
    {
        comport.setParity(QSerialPort::OddParity);
    }
    else
    {
        comport.setParity(QSerialPort::EvenParity);
    }
    if("5" == mdatabits)
    {
        comport.setDataBits(QSerialPort::Data5);
    }else if("6" == mdatabits)
    {
        comport.setDataBits(QSerialPort::Data6);
    }else if("7" == mdatabits)
    {
        comport.setDataBits(QSerialPort::Data7);
    }else
    {
        comport.setDataBits(QSerialPort::Data8);
    }
    if("1.5" == mstopbits)
    {
        comport.setStopBits(QSerialPort::OneAndHalfStop);
    }else if("2" == mstopbits)
    {
        comport.setStopBits(QSerialPort::TwoStop);
    }else
        {
        comport.setStopBits(QSerialPort::OneStop);
    }
    return comport.open(QSerialPort::ReadWrite);
}
//打開串口
void port::on_Btnopen_clicked()
{
    if(true == mIsOpen)
    {
        comport.close();
        ui->Btnopen->setText("打開");
        mIsOpen = false;
        ui->CBoxSerialport->setEnabled(true);
        ui->CBoxBaudrate->setEnabled(true);
        ui->CBoxParity->setEnabled(true);
        ui->CBoxSerialport->setEnabled(true);
        ui->BtnSend->setEnabled(false);
    }else
    {
        if(portconfig() == true)
        {
            mIsOpen = true;
            ui->Btnopen->setText("關閉");
            qDebug()<<"成功打開串口"<<mpotName;
            ui->CBoxSerialport->setEnabled(false);
            ui->CBoxBaudrate->setEnabled(false);
            ui->CBoxParity->setEnabled(false);
            ui->CBoxSerialport->setEnabled(false);
            ui->BtnSend->setEnabled(true);
        }
    }
}
//獲取16進制的值
QByteArray port::GetHexValue(QString str)
{
    QByteArray senddata;
    int hexdata,lowhexdata;
    int hexdatalen = 0;
    int len = str.length();
    senddata.resize(len/2);
    char lstr,hstr;
    for (int i=0;i<len;)
    {
        hstr=str[i].toLatin1();
        if(hstr==' ')
        {
            i++;
            continue;
        }
        i++;
        if(i>=len) break;
        lstr = str[i].toLatin1();
        hexdata = ConvertHexChar(hstr);
        lowhexdata = ConvertHexChar(lstr);
        if((hexdata==16)||(lowhexdata==16))
            break;

        else
            hexdata = hexdata*16+lowhexdata;
            i++;
            senddata[hexdatalen]=(char)hexdata;
            hexdatalen++;
    }
    senddata.resize(hexdatalen);
    return senddata;
}
//數據轉換
char port::ConvertHexChar(char ch)
{
    if((ch >= '0') && (ch <= '9'))
        return ch-0x30;
    else if((ch >= 'A') && (ch <= 'F'))
        return ch-'A'+10;
    else if((ch >= 'a') && (ch <= 'f'))
        return ch-'a'+10;
    else return (-1);
}
//發送函數  發送內容根據選擇轉成16進制發送  加結束符 以及換行
void port::WriteMyCom()
{
    QString str=ui->textEdit->toPlainText();
    QByteArray outData=str.toLatin1();
    int size = outData.size();
    //QT中的回車只有一個字符\n,而windows下需要解釋爲\r\n
    if(outData[size-1]!='\n')
    {
        outData.resize(size-1);
        outData[size]='\n';
        outData[size+1]='\n';
    }
    //默認16進制發送的數據沒有加入回車符
    if(ui->ckHexSend->isChecked())
    {
        outData=this->GetHexValue(str);
        size=outData.size();
        comport.write(outData);
    }else
    {
        size=outData.size();
        comport.write(outData);
    }
}
//發送
void port::on_BtnSend_clicked()
{
    if(mIsOpen == true)
    {
        this->WriteMyCom();
    }
}
//讀取並顯示
void port::on_SerialPort_readyRead()
{
    QByteArray recv = comport.readAll();
    if(ui->ckHexRecv->isChecked())
    {                                              // 轉成16進制 // 字母大寫// 不覆蓋的追加顯示
       ui->textRecv->insertPlainText(QByteArray(recv.toHex(' ').toUpper().append(' ')));
    }else {
       ui->textRecv->append(QString(recv));
    }
}
//清除發送內容
void port::on_pushButton_clicked()
{
    ui->textEdit->clear();
}
//清除顯示內容
void port::on_BtnCleanRecv_clicked()
{
    ui->textRecv->clear();

}
//時間更新函數
void port::time_update()
{
    QString time;
    time=QDateTime::currentDateTime().toString("yyyy-MM-dd HH:mm:ss");
    ui->labtime->setText(QString(time));
}
//打開網址連接
void port::on_btnweb_clicked()
{
    QDesktopServices::openUrl(QString("www.baidu.com"));
}
本人小白學習中,不足之處望見怪。

源程序鏈接:https://download.csdn.net/download/qq_21489487/12408241

本人使用的QT5.13.此處作爲備註。以後方便查看。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章