#include "widget.h"
#include "ui_widget.h"
#include "QtSerialPort/QSerialPortInfo" //导入串口所用的头文件,前提是在.pro文件中添加“QT += serialport”
#include "QDebug"
#include "QMessageBox"
#include "QString"
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
QStringList serialNamePort;
serialPort = new QSerialPort(this);
//查找可用的串口信息并保存
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
serialNamePort<<info.portName();
}
ui->comboBox_serialNum->addItems(serialNamePort); //将可用的串口号写入下拉列表里
connect(serialPort,SIGNAL(readyRead()),this,SLOT(serialPortReadyRead())); //将串口读信号与槽函数进行关联
//readyRead()信号,即串口发送过来数据时,程序就会收到一个可以读数据的信号
}
Widget::~Widget()
{
delete ui;
}
//槽函数:打开/关闭串口 按钮被点击时
void Widget::on_pushButton_OpenOrClose_clicked()
{
QSerialPort::BaudRate baudRate; //定义串口中一些参数的枚举变量:波特率、数据位、停止位、校验位
QSerialPort::DataBits dataBits;
QSerialPort::StopBits stopBits;
QSerialPort::Parity checkBits;
//qDebug() <<ui->comboBox_boundRate->currentIndex();
/*
*接下来的执行逻辑:
* 1、先判断串口下拉栏里是否获取到串口,
* 如果(没有串口),
* 则提示用户。
* 否则
* 就将左边从下拉列表中选择好的选项读取出来保存,并尝试打开此串口。
*/
if(ui->comboBox_serialNum->currentIndex() == -1)
{
QMessageBox::information(this,"提示","当前没有可用串口,请刷新后再次尝试");
}
else
{
if(ui->pushButton_OpenOrClose->text() == "打开串口")
{
//读取选择的波特率
switch (ui->comboBox_boundRate->currentIndex())
{
case 0:
baudRate = QSerialPort::Baud2400; break;
case 1:
baudRate = QSerialPort::Baud4800; break;
case 2:
baudRate = QSerialPort::Baud9600; break;
case 3:
baudRate = QSerialPort::Baud115200; break;
}
//读取选择的数据位
switch (ui->comboBox_date->currentIndex())
{
case 0:
dataBits = QSerialPort::Data5; break;
case 1:
dataBits = QSerialPort::Data6; break;
case 2:
dataBits = QSerialPort::Data7; break;
case 3:
dataBits = QSerialPort::Data8; break;
}
//读取选择的停止位
switch (ui->comboBox_stop->currentIndex())
{
case 0:
stopBits = QSerialPort::OneStop; break;
case 1:
stopBits = QSerialPort::OneAndHalfStop; break;
case 2:
stopBits = QSerialPort::TwoStop; break;
}
//读取选择的校验位
switch (ui->comboBox_check->currentIndex())
{
case 0:
checkBits = QSerialPort::NoParity; break;
case 1:
checkBits = QSerialPort::OddParity; break;
case 2:
checkBits = QSerialPort::EvenParity; break;
}
//对定义的串口对象属性赋值
serialPort->setPortName(ui->comboBox_serialNum->currentText());
serialPort->setBaudRate(baudRate);
serialPort->setDataBits(dataBits);
serialPort->setStopBits(stopBits);
serialPort->setParity(checkBits);
//打开串口:用open函数打开,中间参数为串口打开的方式,函数内可能会将上述串口对象属性值进行写入
if(serialPort->open(QIODevice::ReadWrite) == true)
{
QMessageBox::information(this,"提示","串口打开成功");
ui->pushButton_OpenOrClose->setText("关闭串口");
ui->lable_status->setStyleSheet("border-image: url(:/Picture/open.png);"); //修改标签的样式表:打开串口后,显示一个处于开启状态的图标
}
else
QMessageBox::critical(this,"提示","串口打开失败");
}
else if(ui->pushButton_OpenOrClose->text() == "关闭串口")
{
serialPort->close();
QMessageBox::information(this,"提示","串口已关闭");
ui->pushButton_OpenOrClose->setText("打开串口"); //提示下次可以打开
ui->lable_status->setStyleSheet("border-image: url(:/Picture/close.png);"); //修改标签的样式表:关闭后,显示一个关闭的图标
}
}
}
//槽函数:刷新串口 按钮被点击时
void Widget::on_pushButton_refres_clicked()
{
QStringList serialNamePort1;
ui->comboBox_serialNum->clear();
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
serialNamePort1<<info.portName();
}
ui->comboBox_serialNum->addItems(serialNamePort1);
}
//槽函数:从串口中接收数据
void Widget::serialPortReadyRead()
{
QString buf;
buf = QString(serialPort->readAll());
ui->plainTextEdit_Receive->appendPlainText(buf);
//qDebug() << buf;
}
//槽函数:发送 按钮被点击时
void Widget::on_pushButton_Send_clicked()
{
serialPort->write(ui->lineEdit_Send->text().toLocal8Bit().data());
}
void Widget::on_pushButton_clean_clicked()
{
ui->plainTextEdit_Receive->clear();
}
void Widget::on_pushButton_sendClean_clicked()
{
ui->lineEdit_Send->clear();
}
- 1
- 2
- 3
- 4
前往页