serial.c
#include "serial.h" #include "ui_serial.h" serial::serial(QWidget *parent) : QWidget(parent), ui(new Ui::serial) { ui->setupUi(this); system_init(); } serial::~serial() { delete timer; delete ui; } /***子函数代码区****/ //初始化控件 void serial::system_init() { //自动搜索串口号 QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts(); int count = serialPortInfo.count(); for (int i = 0; i < count; i++) { ui->cmb_com->addItem(serialPortInfo.at(i).portName()); } // 禁止最大化按钮 setWindowFlags(windowFlags() & ~Qt::WindowMaximizeButtonHint); // 禁止拖动窗口大小 setFixedSize(this->width(), this->height()); //流控设置 global_port.setFlowControl(QSerialPort::NoFlowControl); //按钮执行事件绑定 connect(信号发出者地址,发什么信号,在那个类触发,触发事件) //打开串口绑定 connect(ui->btn_open, &QPushButton::clicked, this, &serial::btn_open); //搜索串口 connect(ui->btn_search, &QPushButton::clicked, this, &serial::btn_search); //发送数据绑定 connect(ui->btn_push, &QPushButton::clicked, this, &serial::btn_push_send); //接受数据 connect(&global_port, &QSerialPort::readyRead, this, &serial::accept_date); //清除接受区域 connect(ui->btn_del_accept, &QPushButton::clicked, this, &serial::del_Accept); //清除发送区域 connect(ui->btn_del_push, &QPushButton::clicked, this, &serial::del_Send); //定时发送 connect(ui->btn_tim_push, &QPushButton::clicked, this, &serial::timer_send); //停止发送 connect(ui->btn_tim_off, &QPushButton::clicked, this, &serial::send_stop); //定时器 connect(timer, SIGNAL(timeout()), this, SLOT(while_send())); } //串口信息配置函数 void serial::btn_open(bool) { //打开串口 QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts(); int count = serialPortInfo.count(); //先清除开始的串口信息 ui->cmb_com->clear(); for (int i = 0; i < count; i++) { ui->cmb_com->addItem(serialPortInfo.at(i).portName()); } if (flag == 0 && count > 0) { flag = 1; //设置串口号 QString Port_Name = ui->cmb_com->currentText(); global_port.setPortName(Port_Name); //数据位宽 switch (ui->cmb_date->currentIndex()) { case 0: global_port.setDataBits(QSerialPort::Data8); break; case 1: global_port.setDataBits(QSerialPort::Data7); break; case 2: global_port.setDataBits(QSerialPort::Data6); break; default: global_port.setDataBits(QSerialPort::Data5); break; } //停止位 switch (ui->cmb_stop->currentIndex()) { case 0: global_port.setStopBits(QSerialPort::OneStop); break; case 1: global_port.setStopBits(QSerialPort::OneAndHalfStop); break; default: global_port.setStopBits(QSerialPort::TwoStop); break; } //奇偶校验 switch (ui->cmb_parity->currentIndex()) { case 0: global_port.setParity(QSerialPort::NoParity); break; case 1: global_port.setParity(QSerialPort::OddParity); break; default: global_port.setParity(QSerialPort::EvenParity); break; } //波特率 switch (ui->cmb_bound->currentIndex()) { case 0: global_port.setBaudRate(QSerialPort::Baud115200); break; case 1: global_port.setBaudRate(QSerialPort::Baud57600); break; case 2: global_port.setBaudRate(QSerialPort::Baud38400); break; case 3: global_port.setBaudRate(QSerialPort::Baud9600); break; case 4: global_port.setBaudRate(QSerialPort::Baud2400); break; default: global_port.setBaudRate(QSerialPort::Baud1200); break; } global_port.open(QSerialPort::ReadWrite); ui->btn_open->setText("关闭串口"); ui->lab_state->setText("串口已打开"); } else if (flag == 0 && count <= 0) { QMessageBox::information(this, tr("Error"), QStringLiteral("没有搜索到串口"), QMessageBox::Ok); } else { global_port.close(); ui->btn_open->setText("打开串口"); ui->lab_state->setText("串口未打开"); flag = 0; } } //搜索串口函数 void serial::btn_search(bool) { //自动搜索串口号 QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts(); int count = serialPortInfo.count(); //先清除开始的串口信息 ui->cmb_com->clear(); for (int i = 0; i < count; i++) { ui->cmb_com->addItem(serialPortInfo.at(i).portName()); } } //数据发送函数 void serial::btn_push_send(bool) { QString str = ui->lint_send->text(); // 要能正确发送中文字符,需要使用QString的toLocal8Bit方法 // serial->write(str.toLatin1()); global_port.write(str.toLocal8Bit()); global_port.write("\r\n"); } //数据接受函数 void serial::accept_date() { QByteArray buf; QString res; buf = global_port.readAll(); res = QString(buf); if (!buf.isEmpty()) { // 调试输出buf大小 //qDebug()<<buf.size()<<endl; // 将QByteArray数据类型转换,要能正确显示中文,需要使用QString::fromLocal8Bit // QString str = QString::fromUtf8( buf ); QString str = QString::fromLocal8Bit(buf); // 如果以16进制显示数据: if (ui->cbox_hex->isChecked()) { QString hex_data = buf.toHex().data(); // 将buf里的数据转换为16进制 hex_data = hex_data.toUpper(); // 转换为大写 QString hex_str; // 将16进制转换为大写 for (int i = 0; i < hex_data.length(); i += 2) { QString st = hex_data.mid(i, 2); hex_str += st; hex_str += ' '; } ui->lint_accept->insertPlainText(hex_str); } else { ui->lint_accept->insertPlainText(str); } } buf.clear(); } //清除接受区域函数 void serial::del_Accept(bool) { ui->lint_accept->clear(); } //清除发送区域函数 void serial::del_Send(bool) { ui->lint_send->clear(); } //定时发送函数 void serial::timer_send(bool) { //timerEvent(); QString ms = ui->lint_ms->text(); //qDebug()<< ms; //按钮可用控制 timer->start(ms.toInt()); ui->btn_tim_push->setEnabled(false); ui->btn_tim_off->setEnabled(true); } //停止发送函数 void serial::send_stop(bool) { timer->stop(); //按钮可用控制 ui->btn_tim_push->setEnabled(true); ui->btn_tim_off->setEnabled(false); } //定时器函数 void serial::while_send() { QString str = ui->lint_send->text(); global_port.write(str.toLocal8Bit()); global_port.write("\r\n"); } /****end*********/
serial.h文件
/* * @Author: Stylle * @Date: 2020-07-19 21:21:46 * @LastEditors: Stylle * @LastEditTime: 2020-07-22 10:42:47 * @FilePath: \tool-mastar\stylle_toolV1.8\serial.h */ #ifndef SERIAL_H #define SERIAL_H #include <QWidget> /*******user include**********/ //串口头 #include <QSerialPort> #include <QSerialPortInfo> //定时器 #include <QTimer> //串口号数组 #include <QList> //消息弹窗 #include <QMessageBox> /***********end***************/ namespace Ui { class serial; } class serial : public QWidget { Q_OBJECT public: explicit serial(QWidget *parent = 0); ~serial(); private slots: //打开串口按钮函数 void btn_open(bool); //搜索串口按钮函数 void btn_search(bool); //发送信息按钮函数 void btn_push_send(bool); //接受数据 void accept_date(); //清除接受 void del_Accept(bool); //清除发送 void del_Send(bool); //定时发送 void timer_send(bool); //停止发送 void send_stop(bool); //定时执行函数 void while_send(); private: Ui::serial *ui; /***funtion****/ //声明子函数 void system_init(); /***variable***/ //声明变量 QSerialPort global_port; //定时器变量 QTimer *timer = new QTimer(this); //打开按钮状态 bool flag = 0; }; #endif // SERIAL_H
需要注意的是.pro文件中需要在QT+=中加上serialport才能使用串口模块
成品展示