1、前言
本串口助手实现的功能能实现简易的收发。
效果如图所示:
2、代码:
1.首先在.pro文件内引上:
QT += core gui serialport
2.其次.h文件为:
#ifndef WAVE_2_H
#define WAVE_2_H
#include <QMainWindow>
//提示
#include <QMessageBox>
//串口
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
//QString
#include <QString>
//QDateTime
#include <QDateTime>
//QTimer
#include <QtCore/QTimer>
#include <QFile>
#include <QFileDialog>
#include <QToolBar>
QT_BEGIN_NAMESPACE
namespace Ui { class WAVE_2; }
QT_END_NAMESPACE
class WAVE_2 : public QMainWindow
{
Q_OBJECT
public:
WAVE_2(QWidget *parent = nullptr);
~WAVE_2();
public:
bool getSerialPortConfig(void);
private slots:
void on_ON_Button_clicked();
void on_Send_data_Button_clicked();
void on_ClearGet_Button_clicked();
void on_ClearSend_Button_clicked();
void on_SerialPort_readyRead();
void on_OFF_Button_clicked();
private:
Ui::WAVE_2 *ui;
private:
//字符串转16进制
QByteArray QString2Hex(QString str);
//字符转16进制
char ConvertHexChar(char ch);
bool mIsopen;
QSerialPort mSerialPort; //串口对象
QString mPortName ;
QString mBaudRate;
QString mParity;
QString mDataBits;
QString mStopBits;
};
#endif // WAVE_2_H
3.其次.cpp文件为:
#include "wave_2.h"
#include "qserialport.h"
#include "ui_wave_2.h"
WAVE_2::WAVE_2(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::WAVE_2)
{
QStringList serialNamePort;
ui->setupUi(this);
this->setWindowTitle("蒂蒂的百宝箱");
/* 搜索所有可用串口 */
foreach (const QSerialPortInfo &inf0, QSerialPortInfo::availablePorts()) {
serialNamePort<<inf0.portName();
}
ui->serial_Box->addItems(serialNamePort);
connect(&mSerialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPort_readyRead()));
}
WAVE_2::~WAVE_2()
{
delete ui;
}
bool WAVE_2::getSerialPortConfig()//串口配置
{
mPortName = ui->serial_Box->currentText();
mBaudRate = ui->baudrate_Box->currentText();
mParity = ui->checkbit_Box->currentText();
mDataBits = ui->databit_Box->currentText();
mStopBits = ui->stopbit_Box->currentText();
//设置串口配置
mSerialPort.setPortName(mPortName);
if("9600" == mBaudRate)
{
mSerialPort.setBaudRate(QSerialPort::Baud9600);
}
else if("115200" == mBaudRate)
{
mSerialPort.setBaudRate(QSerialPort::Baud115200);
}
//校验位
if("EVEN" == mParity)
{
mSerialPort.setParity(QSerialPort::EvenParity);
}
else if("ODD" == mParity)
{
mSerialPort.setParity(QSerialPort::OddParity);
}
else if("NONE" == mParity)
{
mSerialPort.setParity(QSerialPort::NoParity);
}
//数据位
if("5" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data5);
}
else if("6" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data6);
}
else if("7" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data7);
}
else if("8" == mDataBits)
{
mSerialPort.setDataBits(QSerialPort::Data8);
}
//停止位
if("1.5" == mStopBits)
{
mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
}
else if("2" == mStopBits)
{
mSerialPort.setStopBits(QSerialPort::TwoStop);
}
else if("1" == mStopBits)
{
mSerialPort.setStopBits(QSerialPort::OneStop);
}
//打开串口,读写模式
return mSerialPort.open(QSerialPort::ReadWrite);
}
void WAVE_2::on_ON_Button_clicked()
{
if(true == getSerialPortConfig())
{
mIsopen = true;
QMessageBox::information(this, "蒂蒂温馨提示", "串口已经打开");
ui->Send_data_Button->setEnabled(mIsopen);//串口成功打开,ui界面的发送button使能
}
}
void WAVE_2::on_Send_data_Button_clicked()
{
if(true == mIsopen)
{
//串口写入 ui发送文本框设置返回文本(QString类型),转换成标准C++String再转换成char*字符串指针,中文不支持
// mSerialPort.write(ui->TextSend->toPlainText().toStdString().c_str());
//更换成toPlainText().toLocal8Bit()既可以发送字符,数字,也可以发送中文
mSerialPort.write(ui->Send_Text->toPlainText().toLocal8Bit());
}
}
void WAVE_2::on_ClearGet_Button_clicked()
{
ui->receice_Text->clear();
}
void WAVE_2::on_ClearSend_Button_clicked()
{
ui->Send_Text->clear();
}
void WAVE_2::on_SerialPort_readyRead()
{ if(true == mIsopen)
{
QString sysTime;//定义系统时间变量
//接收槽 接收到信号内容并设置给ui界面的文本框
QByteArray recvData = mSerialPort.readAll();
QString Data = QString::fromLocal8Bit(recvData);//转换格式QString::fromLocal8Bit可以显示中文
//setPlainText()只能显示一次 insertPlainText()多次显示不换行 append()多次显示且换行
sysTime = QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss\n");//换行使用\n即可
ui->receice_Text->append(sysTime + QString("接收: " + Data));//接收文本框显示数
}
}
//字符转16进制
char WAVE_2::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进制
QByteArray WAVE_2::QString2Hex(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;
}
void WAVE_2::on_OFF_Button_clicked()
{
mSerialPort.close();
QMessageBox::information(this, "蒂蒂温馨提示", "串口已经关闭");
}
4.所需要的组件为:
QComboBox:5个——作为串口号、波特率、数据位、停止位以及检验位的选择设定。
QPushButton:5个——作为开关按钮、清空接收与发送框按钮以及最后的发送按钮。
相应的操作为:右键点击控件>转到槽>即可自动得到槽函数进行编辑。
QTextBrowser:1个——作为接收框,呈现接收数据文本。
QTextEdit:1个——作为发送框,编辑输出文本。
3、最后
超级简单的一份制作,简单看代码就能明白过来,当然,要继续做更多功能的串口助手可以继续往下做下去。满足自己的需要就好,也当练手。