界面布局:
widget.h
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QSerialPort>
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
Q_OBJECT
public:
Widget(QWidget *parent = nullptr);
~Widget();
bool getPortInfo(); //设置串口信息,返回是否打开串口
private slots:
void on_openButton_clicked(); //串口开关槽函数
void on_sendButton_clicked(); //发送按钮槽函数
void on_SerialPoirtReadyRead(); //串口接收数据槽函数
private:
Ui::Widget *ui;
bool buttonStatus; //定义打开按钮状态
QString m_PortName; //定义端口名字
QString m_Baudrate; //定义波特率
QString m_databit; //定义数据位
QString m_checkbit; //定义校验位
QString m_stop; //定义停止位
QSerialPort m_serialPort; //定义串口
};
#endif // WIDGET_H
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QSerialPortInfo>
#include <QList>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
buttonStatus = false;
ui->sendButton->setEnabled(false); //当串口是关闭状态时发送按钮不能点击
QList<QSerialPortInfo>ListPort =QSerialPortInfo::availablePorts(); //将可用的串口设置为List
int cnt =ListPort.count(); //统计有多少个可用的串口
for(int i = 0;i<cnt;i++){
ui->portBox->addItem(ListPort.at(i).portName()); //将串口智能添加到portBox中
}
//接收区数据不能认为输入
ui->receive->setEnabled(false);
connect(&m_serialPort,SIGNAL(readyRead()),this,SLOT(on_SerialPoirtReadyRead()));
//清空接收区数据
connect(ui->cleanreceive,&QPushButton::clicked,[=](){
ui->receive->clear();
});
//清空发送区数据
connect(ui->cleansend,&QPushButton::clicked,[=](){
ui->send->clear();
});
}
Widget::~Widget()
{
delete ui;
}
bool Widget::getPortInfo(){
//获取串口配置
m_PortName = ui->portBox->currentText();
m_Baudrate = ui->baudBox->currentText();
m_databit = ui->dataBit->currentText();
m_checkbit = ui->checkBit->currentText();
m_stop = ui->stopBit->currentText();
//设置串口配置
m_serialPort.setPortName(m_PortName); //设置串口
if(m_Baudrate == "9600"){ //ui界面中波特率是字符串形式,所以要进行判断,然后在设置的时候设置成int形式
m_serialPort.setBaudRate(9600);
}else if(m_Baudrate == "19200"){
m_serialPort.setBaudRate(19200);
}else if(m_Baudrate == "115200"){
m_serialPort.setBaudRate(115200);
}
if(m_databit == "5"){ //设置数据位
m_serialPort.setDataBits(QSerialPort::Data5);
}else if(m_databit == "6"){
m_serialPort.setDataBits(QSerialPort::Data6);
}else if(m_databit == "7"){
m_serialPort.setDataBits(QSerialPort::Data7);
}else if(m_databit == "8"){
m_serialPort.setDataBits(QSerialPort::Data8);
}
if(m_checkbit == "None"){ //设置校验位
m_serialPort.setParity(QSerialPort::NoParity);
}else if(m_checkbit == "Odd"){
m_serialPort.setParity(QSerialPort::OddParity);
}else if(m_checkbit == "Even"){
m_serialPort.setParity(QSerialPort::EvenParity);
}
if(m_stop == "1"){ //设置停止位
m_serialPort.setStopBits(QSerialPort::OneStop);
}else if(m_stop == "2"){
m_serialPort.setStopBits(QSerialPort::TwoStop);
}
m_serialPort.open(QSerialPort::ReadWrite);
return m_serialPort.isOpen();
}
void Widget::on_openButton_clicked() //打开串口槽函数
{
if(buttonStatus == true){ //串口助手处于打开状态时按下按钮
m_serialPort.close();
ui->openButton->setText("打开");
buttonStatus = false;
ui->baudBox->setEnabled(true); //因为处于关闭状态所以将设置使能
ui->dataBit->setEnabled(true);
ui->portBox->setEnabled(true);
ui->checkBit->setEnabled(true);
ui->stopBit->setEnabled(true);
ui->sendButton->setEnabled(false);
}else{ //串口助手处于关闭状态时按下按钮
if(getPortInfo() == true){
ui->openButton->setText("断开");
buttonStatus = true;
ui->baudBox->setEnabled(false); //因为处于开启状态所以将设置失能
ui->dataBit->setEnabled(false);
ui->portBox->setEnabled(false);
ui->checkBit->setEnabled(false);
ui->stopBit->setEnabled(false);
ui->sendButton->setEnabled(true);
}else{
buttonStatus = false; //设置按钮状态为关闭
}
}
}
void Widget::on_sendButton_clicked() //发送数据槽函数
{
if(buttonStatus == true){ //当串口是打开状态
m_serialPort.write(ui->send->toPlainText().toStdString().c_str()); //转换成字符串指针
}
}
void Widget::on_SerialPoirtReadyRead() //接收数据槽函数
{
if(buttonStatus == true){ //当串口是打开状态
QByteArray recvData = m_serialPort.readAll();
ui->receive->append(QString(recvData)); //追加到之前的信息之后防止之前的信息被覆盖掉
}
}