Qt串口助手
- ui设计图
- 效果
代码实现
/****MySerialPort3.h****/
#ifndef MYSERIALPORT3_H
#define MYSERIALPORT3_H
#include <QMainWindow>
#include <QSerialPort>
#include <QSerialPortInfo>
namespace Ui {
class MySerialPort3;
}
class MySerialPort3 : public QMainWindow
{
Q_OBJECT
public:
explicit MySerialPort3(QWidget *parent = nullptr);
~MySerialPort3();
void serialInit();
void baudRateInit();
void dataBitsInit();
void stopBitsInit();
void parityInit();
void flowControlInit();
private slots:
void on_btnClearRecv_clicked();
void on_btnClearSend_clicked();
void on_btnSend_clicked();
void on_readyRead();
void on_btnSwitch_clicked();
private:
Ui::MySerialPort3 *ui;
QSerialPort *serialPort;
QSerialPortInfo *serialPortInfo;
};
#endif // MYSERIALPORT3_H
/****MySerialPort3.cpp**/
#include "mySerialPort3.h"
#include "ui_mySerialPort3.h"
#include <QMessageBox>
#include <QDebug>
MySerialPort3::MySerialPort3(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MySerialPort3)
{
ui->setupUi(this);
serialInit();
baudRateInit();
dataBitsInit();
stopBitsInit();
parityInit();
flowControlInit();
connect(serialPort,&QSerialPort::readyRead,this,&MySerialPort3::on_readyRead);
}
MySerialPort3::~MySerialPort3()
{
delete ui;
}
//扫描串口
void MySerialPort3::serialInit()
{
serialPort = new QSerialPort(this);
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
ui->cmbChooseSerial->addItem(info.portName());
}
}
//波特率初始化
void MySerialPort3::baudRateInit()
{
QStringList strList;
strList<<"9600"<<"115200";
ui->cmbBaudRate->addItems(strList);
}
//数据位
void MySerialPort3::dataBitsInit()
{
QStringList strList;
strList<<"5"<<"6"<<"7"<<"8";
ui->cmbDataBits->addItems(strList);
}
//停止位
void MySerialPort3:: stopBitsInit()
{
QStringList strList;
strList<<"1"<<"2";
ui->cmbStopBits->addItems(strList);
}
//校验位
void MySerialPort3::parityInit()
{
ui->cmbParity->addItem(QString::number(QSerialPort::NoParity));
ui->cmbParity->addItem(QString::number(QSerialPort::OddParity));
ui->cmbParity->addItem(QString::number(QSerialPort::EvenParity));
ui->cmbParity->addItem(QString::number(QSerialPort::MarkParity));
}
void MySerialPort3::flowControlInit()
{
ui->cmbFlowControl->addItem(QString::number(QSerialPort::NoFlowControl));
}
void MySerialPort3::on_btnClearRecv_clicked()
{
ui->textEditRecv->clear();
}
void MySerialPort3::on_btnClearSend_clicked()
{
ui->textEditSend->clear();
}
//打开串口的情况下才发送
void MySerialPort3::on_btnSend_clicked()
{
if(!serialPort->isOpen()){
QMessageBox::critical(this,"串口","串口未打开",QMessageBox::Ok);
return;
}
//读取发送框中内容并发送
//serialPort->write(ui->textEditSend->toPlainText().toUtf8().data());//不能发送中文
serialPort->write(ui->textEditSend->toPlainText().toLocal8Bit());//可以发送中文
ui->textEditSend->clear();
}
void MySerialPort3::on_readyRead()
{
if(!serialPort->isOpen()){
QMessageBox::critical(this,"串口","串口未打开",QMessageBox::Ok);
return;
}
QByteArray arry = serialPort->readAll();
// ui->textEditRecv->append(QString(arry.data()));//不能接收中文
//ui->textEditRecv->append(QString(arry));//不能接收中文
ui->textEditRecv->append(QString::fromLocal8Bit(arry));//可以接收中文
}
void MySerialPort3::on_btnSwitch_clicked()
{
if(ui->btnSwitch->text() == "打开串口"){
//设置串口
serialPort->setPortName(ui->cmbChooseSerial->currentText());
//设置波特率
switch (ui->cmbBaudRate->currentText().toInt()) {
case 9600:
serialPort->setBaudRate(QSerialPort::Baud9600);
break;
case 115200:
serialPort->setBaudRate(QSerialPort::Baud115200);
break;
default:
break;
}
//设置数据位
switch (ui->cmbDataBits->currentText().toInt()) {
case 5:
serialPort->setDataBits(QSerialPort::Data5);
break;
case 6:
serialPort->setDataBits(QSerialPort::Data6);
break;
case 7:
serialPort->setDataBits(QSerialPort::Data7);
break;
case 8:
serialPort->setDataBits(QSerialPort::Data8);
break;
default:
break;
}
//设置停止位
switch (ui->cmbStopBits->currentText().toInt()) {
case 1:
serialPort->setStopBits(QSerialPort::OneStop);
break;
case 2:
serialPort->setStopBits(QSerialPort::TwoStop);
break;
default:
break;
}
//设置校验位
if(ui->cmbParity->currentText() == QString(QSerialPort::OddParity))
serialPort->setParity(QSerialPort::OddParity);
else if(ui->cmbParity->currentText() == QString(QSerialPort::EvenParity))
serialPort->setParity(QSerialPort::EvenParity);
else if(ui->cmbParity->currentText() == QString(QSerialPort::MarkParity))
serialPort->setParity(QSerialPort::MarkParity);
//设置流控制位
serialPort->setFlowControl(QSerialPort::NoFlowControl);
bool isOpen = serialPort->open(QIODevice::ReadWrite);
if(!isOpen)
QMessageBox::critical(this,"critical","串口打开失败",QMessageBox::Ok);
ui->btnSwitch->setText(QString("关闭串口"));
ui->cmbChooseSerial->setEnabled(false);
ui->cmbBaudRate->setEnabled(false);
ui->cmbDataBits->setEnabled(false);
ui->cmbStopBits->setEnabled(false);
ui->cmbParity->setEnabled(false);
ui->cmbFlowControl->setEnabled(false);
}else{
serialPort->close();
ui->btnSwitch->setText(QString("打开串口"));
ui->cmbChooseSerial->setEnabled(true);
ui->cmbBaudRate->setEnabled(true);
ui->cmbDataBits->setEnabled(true);
ui->cmbStopBits->setEnabled(true);
ui->cmbParity->setEnabled(true);
ui->cmbFlowControl->setEnabled(true);
}
}
/*******main.cpp***************/
#include "mainwindow.h"
#include <QApplication>
#include "mySerialPort1.h"
#include "mySerialPort2.h"
#include "mySerialPort3.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MySerialPort3 serialPort3;
serialPort3.show();
return a.exec();
}
注意:实验所用到的串口是虚拟串口,虚拟串口使用的软件为“ Virtual Serial Port Driver 6.9 ”。
虚拟串口软件截图:
在使用添加串口之后电脑的"设备管理器"中会看到虚拟出来的串口。
电脑中虚拟出来的串口如下:
展示
接收中文乱码,与发送中文乱码问题解决:
/**发送数据和接收数据的方法中修改为下面的两行代码即可解决*/
serialPort->write(ui->textEditSend->toPlainText().toLocal8Bit());//支持发送中文
ui->textEditRecv->append(QString::fromLocal8Bit(arry));//支持接收中文