这里只说这个问题,代码中我写有详细的注释,看注释即可。
至于qt怎么写串口可参考下面三篇博客:
QT初体验:手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客
【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程_qt串口调试软件源码下载-CSDN博客
一、.pro引入qt串口模块
.pro
QT += core gui
QT += serialport//引入串口模块
二、.h定义
.h
#include <QSerialPort>
#include "QSerialPortInfo"
public:
QSerialPort *serialPort;//定义串口指针
private slots:
void on_OpenSerialPort_pushButton_clicked();//打开/关闭串口
void on_RefreshSerialPort_pushButton_clicked();//刷新串口
三、.cpp实现
.cpp
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
ui_S = new Serial_Set() ;//将类指针实例化-子窗口
/*一些开机初始值*/
setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰
/*找出当前连接的串口并显示到SerialPort_comboBox*/
QStringList serialNamePort; // 串口端口号列表
serialPort = new QSerialPort(this); // 创建一个串口实例
ui->SerialPort_comboBox->clear(); // 清除文本
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())//通过QSerialPortInfo查找可用串口
{
/* 方案1-带串口号和串口设备信息---追加文本*/
/*使用方案1,直接打不开串口,必须对文本再进行处理,串口名字会影响打开串口的判断*/
// QString portDescription = info.description();//获取所有设备信息
// ui->SerialPort_comboBox->addItem(info.portName() + ": "+portDescription);
ui->SerialPort_comboBox->addItem(info.portName() + ": "+info.description());//效果同上面两行一致
/* 方案2-仅串口号不携带有串口设备信息*/
// ui->SerialPort_comboBox->addItem(info.portName());
// /*qDebug在QT的编译输出框中会打印下列信息,打包以后看不见的*/
// qDebug() << "Name : " << info.portName();//返回串口名称
// qDebug() << "Description : " << info.description();//返回串口说明
// qDebug() << "Manufacturer: " << info.manufacturer();//返回制造商信息
// qDebug() << "Serial Number: " << info.serialNumber();//返回串口连接设备的串口唯一序列号
// qDebug() << "System Location: " << info.systemLocation(); //系统本地位置
if(serialPort->isOpen())//如果串口已经打开了 先给他关闭了
{
serialPort->clear();
serialPort->close();
}
}
/*手动连接信号与槽函数*/
connect(serialPort,SIGNAL(readyRead()),this,SLOT(manual_serialPortReadyRead()));
}
.cpp
/*打开串口-串口配置*/
void Widget::on_OpenSerialPort_pushButton_clicked()
{
/*串口及默认参数初始化*/
QSerialPort::BaudRate baudRate=QSerialPort::Baud115200;
QSerialPort::DataBits dataBits=QSerialPort::Data8;
QSerialPort::StopBits stopBits=QSerialPort::OneStop;
QSerialPort::Parity checkBits=QSerialPort::NoParity;
// /*获取串口波特率*/
if(ui->BaudRate_comboBox->currentText()=="4800")
{baudRate=QSerialPort::Baud4800;}
else if(ui->BaudRate_comboBox->currentText()=="9600")
{baudRate=QSerialPort::Baud9600;}
else if(ui->BaudRate_comboBox->currentText()=="115200")
{baudRate=QSerialPort::Baud115200;}
/*获取串口数据位*/
if(ui->DateBits_comboBox->currentText()=="5")
{dataBits=QSerialPort::Data5;}
else if(ui->DateBits_comboBox->currentText()=="6")
{dataBits=QSerialPort::Data6;}
else if(ui->DateBits_comboBox->currentText()=="7")
{dataBits=QSerialPort::Data7;}
else if(ui->DateBits_comboBox->currentText()=="8")
{dataBits=QSerialPort::Data8;}
/*获取串口停止位*/
if(ui->StopBit_comboBox->currentText()=="1")
{stopBits=QSerialPort::OneStop;}
else if(ui->StopBit_comboBox->currentText()=="1.5")
{stopBits=QSerialPort::OneAndHalfStop;}
else if(ui->StopBit_comboBox->currentText()=="2")
{stopBits=QSerialPort::TwoStop;}
/*获取串口奇偶校验位*/
if(ui->CheckBit_comboBox->currentText() == "none"){
{checkBits = QSerialPort::NoParity;}
}else if(ui->CheckBit_comboBox->currentText() == "奇校验"){
{checkBits = QSerialPort::OddParity;}
}else if(ui->CheckBit_comboBox->currentText() == "偶校验"){
{checkBits = QSerialPort::EvenParity;}
}else{;}
// 初始化串口属性:端口号、波特率、数据位、停止位、奇偶校验位数
serialPort->setPortName(ui->SerialPort_comboBox->currentText());//设置端口号
serialPort->setBaudRate(baudRate);
serialPort->setDataBits(dataBits);
serialPort->setStopBits(stopBits);
serialPort->setParity(checkBits);
/*对串口名字进行处理---section函数即分割字符串。
在串口信息遍历时我们在串口号和串口详细信息中间加了“:”
(方案1),现在以此“:”为界,分割字符
若是使用方案2,此语句也不需要注销,找不到“:”重写后还是与方案2预期一样*/
QString spTxt = ui->SerialPort_comboBox->currentText();
spTxt = spTxt.section(':', 0, 0);//spTxt.mid(0, spTxt.indexOf(":"));
//qDebug() << spTxt;
serialPort->setPortName(spTxt);//重写serialPort
//判断串口是否打开成功
if(ui->OpenSerialPort_pushButton->text() == "打开串口")
{
if(serialPort->open(QIODevice::ReadWrite) == true)
{
setLED(ui->LED_label, 2, 16);//串口状态指示灯-绿
ui->OpenSerialPort_pushButton->setText(tr("关闭串口"));
ui->SerialPort_comboBox->setEnabled(false);// 让端口号下拉框不可选,避免误操作
ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("打开成功!"));
/*打开串口后--定时器开启--定时时间*/
timSend->start(timSend_TIME);
}
else
{
setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰
ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("打开失败,此端口可能被占用!"));
}
}
else
{
serialPort->close();
ui->OpenSerialPort_pushButton->setText(tr("打开串口"));
ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("关闭成功!"));
ui->SerialPort_comboBox->setEnabled(true);// 让端口号下拉框可选
setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰
/*关闭串口后--关闭定时器*/
timSend->stop(); timer_overtime->stop(); timer_status->stop();
}
}
/*刷新串口*/
void Widget::on_RefreshSerialPort_pushButton_clicked()
{
ui->SerialPort_comboBox->clear();//清除防止多次重叠刷新
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
// ui->SerialPort_comboBox->addItem(info.portName());
ui->SerialPort_comboBox->addItem(info.portName() + ": "+info.description());
}
}