廢話不多說直接上圖, 其中包含系統時間獲取顯示 ;以及網址鏈接跳轉功能;
串口開開啓以及顯示及發送方式;串口號是自動查詢。所以選擇好波特率就能使用,上圖是我與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.此處作爲備註。以後方便查看。