一、关于QT版本

二、实现效果

三、功能简述

四、部分代码(源工程文件文章末尾链接下载)

QT       += core gui serialportgreaterThan(QT_MAJOR_VERSION, 4): QT += widgetsCONFIG += c++11# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0SOURCES += \main.cpp \widget.cppHEADERS += \widget.hFORMS += \widget.ui# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#include "widget.h"
#include "ui_widget.h"#include <QFile>
#include <QFileDialog>Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);recByteLen=0;init_all_combox();updateComTimer.start(1000);connect(&mySerial,&QSerialPort::readyRead,this,&Widget::serial_read_data);connect(&updateComTimer,&QTimer::timeout,this,&Widget::init_port_combobox);connect(&sendTime,&QTimer::timeout,this,&Widget::serial_send_data);
}Widget::~Widget()
{updateComTimer.destroyed();sendTime.destroyed();delete ui;
}void Widget::serial_read_data()
{QByteArray bytes = mySerial.readAll();QString dataString;recByteLen+=bytes.length();if(ui->timeStampCheckBox->isChecked()){dataString.append("<font color=\"#FF0000\">");dataString.append(QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss:zzz"));dataString.append("</font>");}dataString.append(ui->hexShowCheckBox->isChecked()?bytes.toHex(' '):QString::fromLocal8Bit(bytes));//保存到文件选项,将数据保存到文件QString fileName = ui->saveFileNameEdit->text();if(ui->saveFileCheckBox->isChecked()){QFile file(fileName);file.open(QIODevice::WriteOnly | QIODevice::Text|QIODevice::Append);file.write(dataString.toUtf8()+"\n");file.close();}// 读取数据后,将数据输出至uiui->recTextShowTextBrowser->append(dataString);QString s = QString(" 接收区:已接收%1字节").arg(recByteLen);ui->recGroupBox->setTitle(s);
}void Widget::on_serialSwitchBtn_clicked()
{if(mySerial.isOpen()){//串口已经打开mySerial.clear();mySerial.close();ui->serialSwitchBtn->setText("打开串口");ui_enable(true);//发送区控件状态处理ui->timingSendCheckBox->setChecked(false);sendTime.stop();ui->sendTimeEdit->setEnabled(true);return;}mySerial.setPortName(ui->serialPortComBox->currentText());mySerial.setBaudRate(static_cast<QSerialPort::Parity>(ui->serialBandrateComBox->currentData().toInt()));mySerial.setParity(static_cast<QSerialPort::Parity>(ui->serialVerifyBitComBox->currentData().toInt()));mySerial.setDataBits(static_cast<QSerialPort::DataBits>(ui->serialDataBitComBox->currentData().toInt()));mySerial.setStopBits(static_cast<QSerialPort::StopBits>(ui->serialStopBitComBox->currentData().toInt()));if(ui->flowCheckBox->isChecked()){if(ui->flowModeCheckBox->isChecked())mySerial.setFlowControl(QSerialPort::HardwareControl);elsemySerial.setFlowControl(QSerialPort::SoftwareControl);}elsemySerial.setFlowControl(QSerialPort::NoFlowControl);if(mySerial.open(QSerialPort::ReadWrite)){ui->serialSwitchBtn->setText("关闭串口");ui_enable(false);}else{QMessageBox::warning(this,"错误",mySerial.errorString());}}void Widget::on_saveWidgetBtn_clicked()
{QString path = QFileDialog::getOpenFileName(this,"open","../","TXT(*.txt)");if(path.isEmpty()==false){//创建文件对象QFile file(path);bool isOk = file.open(QIODevice::WriteOnly| QIODevice::Text);if(isOk==true){QString context = ui->recTextShowTextBrowser->document()->toPlainText();file.write(context.toUtf8());}file.close();}
}void Widget::on_clearRecBtn_clicked()
{recByteLen=0;ui->recTextShowTextBrowser->clear();ui->recGroupBox->setTitle(" 接收区:已接收0字节");
}void Widget::on_sendBtn_clicked()
{if(!mySerial.isOpen()){QMessageBox::warning(this,"错误","串口没有连接!");return;}serial_send_data();
}void Widget::on_clearSendAreaBtn_clicked()
{ui->sendTextTextEdit->clear();
}
void Widget::on_saveFileCheckBox_clicked(bool checked)
{if(checked==false){ui->saveFileNameEdit->setEnabled(true);return;}QString fileName = ui->saveFileNameEdit->text();if(fileName.isEmpty()){QMessageBox::warning(this,"错误","文件名不能为空!");ui->saveFileCheckBox->setCheckState(Qt::Unchecked);ui->saveFileNameEdit->setEnabled(true);return;}ui->saveFileNameEdit->setEnabled(false);
}
void Widget::on_timingSendCheckBox_clicked(bool checked)
{if(checked){int time = ui->sendTimeEdit->text().toInt();if(time<=0){ui->timingSendCheckBox->setChecked(false);QMessageBox::warning(this,"错误","请在下方框中输入定时发送时间!");return;}if(!mySerial.isOpen()){ui->timingSendCheckBox->setChecked(false);QMessageBox::warning(this,"错误","串口未连接!");return;}ui->sendBtn->setEnabled(false);ui->sendTimeEdit->setEnabled(false);sendTime.start(time);}else{ui->sendBtn->setEnabled(true);ui->sendTimeEdit->setEnabled(true);sendTime.stop();}
}
void Widget::serial_send_data()
{QString val = ui->sendTextTextEdit->toPlainText();if(val.length()<=0)return;if(ui->hexSendCheckBox->isChecked()){val = val.trimmed();QByteArray inputData;QStringList stringList = val.split(" ");for (auto var : stringList){if (var.length()){quint8 byte = var.toInt(Q_NULLPTR, 16);inputData.append(byte);}}if(ui->sendNewLineCheckBox->isChecked())inputData.append(0x0D).append(0x0A);mySerial.write(inputData);}else{if(ui->sendNewLineCheckBox->isChecked())val.append("\r\n");mySerial.write(val.toLocal8Bit());}
}void Widget::ui_enable(bool isEnable)
{ui->serialPortComBox->setEnabled(isEnable);ui->serialBandrateComBox->setEnabled(isEnable);ui->serialDataBitComBox->setEnabled(isEnable);ui->serialVerifyBitComBox->setEnabled(isEnable);ui->serialStopBitComBox->setEnabled(isEnable);ui->flowCheckBox->setEnabled(isEnable);ui->flowModeCheckBox->setEnabled(isEnable);
}void Widget::init_all_combox()
{init_port_combobox();init_port_combobox();init_bandrate_combobox();init_databit_combobox();init_paritybit_combobox();init_stopbit_combobox();init_ui_context();
}void Widget::init_port_combobox()
{// 获取本机所有串口设备信息QList<QSerialPortInfo> infoList = QSerialPortInfo::availablePorts();static  int infoListLen;if(infoList.length()==infoListLen)return;infoListLen = infoList.length();// 为了在下拉选项中显示更多信息,采用模型形式添加设备列表QStandardItemModel *model = new QStandardItemModel(ui->serialPortComBox);for (auto var : infoList){QStandardItem *item = new QStandardItem(var.portName());item->setToolTip(var.portName() + " " + var.description());model->appendRow(item);}// 将设备信息添加至设备选择框中,添加前清除原有信息ui->serialPortComBox->clear();ui->serialPortComBox->setModel(model);
}
void Widget::init_bandrate_combobox()
{ui->serialBandrateComBox->clear();QList<qint32> bdList = QSerialPortInfo::standardBaudRates();for (auto var : bdList){ui->serialBandrateComBox->addItem(QString::number(var), QVariant::fromValue(var));}ui->serialBandrateComBox->setCurrentText("9600");
}
void Widget::init_databit_combobox()
{ui->serialDataBitComBox->clear();ui->serialDataBitComBox->addItem(QString::number(QSerialPort::Data5,10),QVariant::fromValue(QSerialPort::Data5));ui->serialDataBitComBox->addItem(QString::number(QSerialPort::Data6,10),QVariant::fromValue(QSerialPort::Data6));ui->serialDataBitComBox->addItem(QString::number(QSerialPort::Data7,10),QVariant::fromValue(QSerialPort::Data7));ui->serialDataBitComBox->addItem(QString::number(QSerialPort::Data8,10),QVariant::fromValue(QSerialPort::Data8));ui->serialDataBitComBox->setCurrentText(QString::number(QSerialPort::Data8,10));
}
void Widget::init_paritybit_combobox()
{ui->serialVerifyBitComBox->clear();ui->serialVerifyBitComBox->addItem("None",QVariant::fromValue(QSerialPort::NoParity));ui->serialVerifyBitComBox->addItem("Even",QVariant::fromValue(QSerialPort::EvenParity));ui->serialVerifyBitComBox->addItem("Odd",QVariant::fromValue(QSerialPort::OddParity));ui->serialVerifyBitComBox->addItem("Space",QVariant::fromValue(QSerialPort::SpaceParity));ui->serialVerifyBitComBox->addItem("Mark",QVariant::fromValue(QSerialPort::MarkParity));ui->serialVerifyBitComBox->setCurrentText("None");
}
void Widget::init_stopbit_combobox()
{ui->serialStopBitComBox->clear();ui->serialStopBitComBox->addItem("1",QVariant::fromValue(QSerialPort::OneStop));ui->serialStopBitComBox->addItem("1.5",QVariant::fromValue(QSerialPort::OneAndHalfStop));ui->serialStopBitComBox->addItem("2",QVariant::fromValue(QSerialPort::TwoStop));}
void Widget::init_ui_context()
{ui->saveFileNameEdit->setText("save.txt");ui->sendTimeEdit->setText("1000");
}

五、源工程下载
完整工程下载

使用QT写的串口调试助手源代码分享(一)相关推荐

  1. 串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能

    串口调试助手源代码 qt编写 带协议解析 帧判断 通信数据保存等功能 使用说明介绍 1.功能介绍: 采用Qt编写的串口调试助手工具,功能齐全,除了具备十六进制收发及文件保存等基本功能外,还具有以下功能 ...

  2. 基于CSerialPort修改类的串口调试助手源代码(支持中文、自动保存等)

    转自:  http://blog.csdn.net/itas109/article/details/51337538 [最新修正版2016-05-07] http://blog.csdn.net/it ...

  3. qt做串口调试助手——通信收发篇

    qt实现串口调试助手 串口初始化 串口调试助手的初始化,一般包括波特率.端口号.奇偶校验.数据位和停止位.如果最终需要将串口商业化,一般这些参数都会交给用户自定义,但我们写了自己用,且上位机和下位机同 ...

  4. QT学习笔记:简单的串口调试助手--实现 字符与十六进制发送接收

    这两天捣鼓了一个简单的串口调试助手,参考QT例程terminal,可能是因为新手的缘故,发现字符发送和字符显示比较容易实现,而十六进制相对难实现一些.在这里记录一下我的实现方法. /// /// \b ...

  5. 【Qt串口调试助手】1.8 - 修改Qt应用图标和窗口图标

    修改Qt应用图标和窗口图标. GitHub源码:Qt串口调试助手下载 修改应用图标 首先选择一张喜欢的图片,来作为应用图标,图片格式必须为 .ico. easyicon.net 有很多可供下载的资源. ...

  6. 【Qt串口调试助手】1.7 - QLabel标签插入链接,修改Qt应用图标

    QLabel标签添加超链接,点击 即可通过默认浏览器打开网页. GitHub源码:Qt串口调试助手下载 QLabel标签添加链接 Qt支持 HTML语音,所以可以对链接颜色.字体.有无下划线等进行设置 ...

  7. 【Qt串口调试助手】1.6 - QTimer定时自动发送

    使用定时器,控制应用自动发送数据,发送间隔时间可控. GitHub源码:Qt串口调试助手下载 QTimer定时自动发送 (1)ui设计界面拖入 Line Edit.Label.Check Box. ( ...

  8. 【Qt串口调试助手】1.5 - 发送/接收字节数量统计

    对发送/接收的字节数目计数,显示到底部状态栏中. GitHub源码:Qt串口调试助手下载 接收字节数计数 (1)在 mainwindow.h文件中创建 收发数属性,再创建两个 标签指针,用于显示收发数 ...

  9. 【Qt串口调试助手】1.0 - 400行代码撸一个Qt5串口调试助手框架

    1. 设计目的 使用Qt设计一款串口调试助手,具有自动扫描串口端口.列表端口硬件信息.16进制转换.收发数目统计.定时发送等功能.代码注释清晰,应用无内建缓存区,运行效率高,适合拿来学习和作为二次开发 ...

  10. 【Qt串口调试助手】1.4 - 16进制接收/发送

    作为串口调试助手,16进制显示当然是必备功能. 参考文章:QString.QByteArray 16进制转换 GitHub源码:Qt串口调试助手下载 16进制接收 添加两个复选框,"16进制 ...

最新文章

  1. 深度优先搜索(dfs),城堡问题
  2. 拼接字符SQL语句拼接 最后一个字符多出 处理方式
  3. python里、能用分支结构写出循环的算法吗_python变量运算符分支结构循环结构及例题...
  4. pat 乙级 1023 组个最小数(C++)
  5. 常用Jquery前端操作
  6. 分割字符串s使得每个子串都是回文串
  7. 【ES6】什么是Promise?解析Promise的基本用法
  8. flink离线mysql_Flink 流模式跑离线任务
  9. ORACLE PL/SQL编程之八:把触发器说透
  10. 数据库事务隔离级别与锁
  11. Navicat连接Oracle
  12. linux删除ip地址的命令
  13. c语言人民邮电出版社课后答案,C语言程序设计教程(人民邮电出版社) 课后习题解答6-10...
  14. 罗技G304接收器无反应问题,现象及解决方法
  15. 北大AI公开课第六课--自动驾驶与人工智能by百度陈竞凯
  16. 18.10.20日报
  17. 酷狗音乐动态壁纸脱离酷狗音乐独立运行
  18. C#实现全盘扫描,找到符合要求的文件,并把路径写入到TXT中
  19. 小球碰壁反弹加分_Javascript:Canvas的小球碰壁反弹
  20. 计算机课组会议讲话,备课组长会议上的讲话

热门文章

  1. cad脚本合适_CAD脚本学习
  2. MySQL误删数据找回和恢复
  3. 一天入门Tableau详细教程(上)
  4. 组态王与DLT645-2007电能表通讯调试总结
  5. 百度网盘链接在线解析网站_最近很热闹啊,免登陆百度网盘高速链接转换工具...
  6. 在线Cron表达式生成器,定时任务表达式生成器
  7. 车牌识别存储云服务器,云端(服务器)车牌识别技术
  8. iOS 音频视频播放器实现边下载边播放缓存视频
  9. 游戏使用html签名,利用HTML5实现电子签名板文字涂鸦代码
  10. Windows安装Oracle与PlSql教程