从零开始实现自己的串口调试助手(3) - 显示底部收发,优化串口打开/关闭

news2024/11/17 15:46:00

注意:


1. 我们要实现自发自收,要将tx,rx连起来


2.发送的 不能是中文符号,因为这可能导致,读取到的是英文符号 --> 导致接收到的size 和发送的size 大小不一致

3.注意同时定义两个槽函数的时候两个槽函数都会被调用,我们应该注释掉不需要的那个,爆率剩下的那个避免产生干扰

实现收发消息数的显示:

//并且做了一个历史判断 -->避免重复记录 

修改代码:


void Widget::on_btnSendContext_clicked()
{
    const char * sendData = ui->lineEdit_SendContext->text().toStdString().c_str();//QString->String(C++)->char*
    int writeCnt = 0;
    writeCnt = serialPort->write(sendData);
    if(writeCnt == - 1){
      ui->label_SendStatus->setText("SendError!");
    }
    else {
    writeCntTotal += writeCnt;
    qDebug()<<"Send:"<<sendData;
    qDebug()<<"writeCnt"<<writeCnt;

    ui->label_SendStatus->setText("SendOK!");
    ui->label_SendCnt->setNum(writeCntTotal);
    if(strcmp(sendData,sendBak.toStdString().c_str())!=0){ //只有当数据与上一次不相等的时候我们才会追加到我们的历史发生中
     ui->textEditRecord->append(sendData);
     sendBak = QString(sendData);
    }

    }
}

void Widget::on_SerialData_readToRead()
{
  QString recvMessage = serialPort->readAll();
  if(recvMessage != NULL){
  qDebug()<<"get Message: "<<recvMessage;
  ui->textEditRev->append(recvMessage);
  readCntTotal += recvMessage.size();
  qDebug()<<"readCnt"<<recvMessage.size();
  ui->label_RecvCnt->setNum(readCntTotal);
 }


}

输出效果

================================================================

添加关闭/打开按钮功能

添加打开失败的判断:QMessageBox

添加代码

效果图


方式一: 自己定义一个flag,比如serialStatus 判断串口是否被打开


 

void Widget::on_btnCloseOrOpenSerial_clicked()
{
    if(!serialStatus){ //串口没有被打开  --> 配置参数,打开串口

//    1.选择端口号
     serialPort->setPortName(ui->comboBox_serialNum->currentText());
//    2.配置波特率   注意把String ->int
     serialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
//    3.配置数据位
     serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
//    4.配置校验位
     switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配
     {
      case 0:
         serialPort->setParity(QSerialPort::NoParity);
         break;
     case 1:
        serialPort->setParity(QSerialPort::EvenParity);
        break;
     case 2:
       serialPort->setParity(QSerialPort::MarkParity);
        break;
     case 3:
        serialPort->setParity(QSerialPort::OddParity);
        break;
     case 4:
        serialPort->setParity(QSerialPort::SpaceParity);
        break;
     default:
         serialPort->setParity(QSerialPort::UnknownParity);
         break;

     }

//    5.配置停止位
     serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
//    6.流控
     if(ui->comboBox_fileCon->currentText() == "None")
           serialPort->setFlowControl(QSerialPort::NoFlowControl);

    // 配置完毕,打开串口
    if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回true
    qDebug()<<"serial open success!";
    //打开串口后这些串口参数就不可以设置了
    ui->comboBox_dataBit->setEnabled(false);
    ui->comboBox_fileCon->setEnabled(false);
    ui->comboBox_stopBit->setEnabled(false);
    ui->comboBox_Baudrate->setEnabled(false);
    ui->comboBox_checkBit->setEnabled(false);
    ui->comboBox_serialNum->setEnabled(false);
     ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送

    ui->btnCloseOrOpenSerial->setText("关闭串口");
    serialStatus  = true; // 打开成功,设置状态
    }
    //打开失败,给出提示
    else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("打开串口错误!");
        msgBox.setText("打开失败,串口可能占用被拔出");
        msgBox.exec();
    }

  }
  else{ // if 串口已经打开我们就关闭串口,并且让 参数可选
  serialPort->close(); // 关闭串口
  serialStatus = false; // 关闭成功,设置状态

  ui->btnCloseOrOpenSerial->setText("打开串口");
  ui->comboBox_dataBit->setEnabled(true);
  ui->comboBox_fileCon->setEnabled(true);
  ui->comboBox_stopBit->setEnabled(true);
  ui->comboBox_Baudrate->setEnabled(true);
  ui->comboBox_checkBit->setEnabled(true);
  ui->comboBox_serialNum->setEnabled(true);
  ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送

    }

}

效果展示
 

setEnable  --  设置comboBox 是否可变

 

 观察下面的左下角串口配置信息 和 发送按钮的 深色(不可操作) / 白色(可操作)



方式二: checkable --> 利用槽函数判断串口是否被打开


先 √ checkbool

在重新生成 checkbool 类型的 槽函数  



 

void Widget::on_btnCloseOrOpenSerial_clicked(bool checked)
{

    if(!checked){ //串口没有被打开  --> 配置参数,打开串口

//    1.选择端口号
     serialPort->setPortName(ui->comboBox_serialNum->currentText());
//    2.配置波特率   注意把String ->int
     serialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
//    3.配置数据位
     serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
//    4.配置校验位
     switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配
     {
      case 0:
         serialPort->setParity(QSerialPort::NoParity);
         break;
     case 1:
        serialPort->setParity(QSerialPort::EvenParity);
        break;
     case 2:
       serialPort->setParity(QSerialPort::MarkParity);
        break;
     case 3:
        serialPort->setParity(QSerialPort::OddParity);
        break;
     case 4:
        serialPort->setParity(QSerialPort::SpaceParity);
        break;
     default:
         serialPort->setParity(QSerialPort::UnknownParity);
         break;

     }

//    5.配置停止位
     serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
//    6.流控
     if(ui->comboBox_fileCon->currentText() == "None")
           serialPort->setFlowControl(QSerialPort::NoFlowControl);

    // 配置完毕,打开串口
    if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回true
    qDebug()<<"serial open success!";
    //打开串口后这些串口参数就不可以设置了
    ui->comboBox_dataBit->setEnabled(false);
    ui->comboBox_fileCon->setEnabled(false);
    ui->comboBox_stopBit->setEnabled(false);
    ui->comboBox_Baudrate->setEnabled(false);
    ui->comboBox_checkBit->setEnabled(false);
    ui->comboBox_serialNum->setEnabled(false);
     ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送

    ui->btnCloseOrOpenSerial->setText("关闭串口");
   // serialStatus  = true; // 打开成功,设置状态
    }
    //打开失败,给出提示
    else{
        QMessageBox msgBox;
        msgBox.setWindowTitle("打开串口错误!");
        msgBox.setText("打开失败,串口可能占用被拔出");
        msgBox.exec();
    }

  }
  else{ // if 串口已经打开我们就关闭串口,并且让 参数可选
  serialPort->close(); // 关闭串口
 // serialStatus = false; // 关闭成功,设置状态

  ui->btnCloseOrOpenSerial->setText("打开串口");
  ui->comboBox_dataBit->setEnabled(true);
  ui->comboBox_fileCon->setEnabled(true);
  ui->comboBox_stopBit->setEnabled(true);
  ui->comboBox_Baudrate->setEnabled(true);
  ui->comboBox_checkBit->setEnabled(true);
  ui->comboBox_serialNum->setEnabled(true);
  ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送

    }
}



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1792530.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2024 年最新安装MAC-vue教学包括常见错误

花了一上午时间终于将 vue 的工程文件安装好了&#xff0c;本教材是傻瓜式操作&#xff0c;按着教程一步一步操作最后就可以看到页面了。 安装Node 1.在线地址&#xff1a; https://nodejs.org/en 2、点击 Download Node.js下载即可&#xff0c;下载完成后&#xff0c;傻瓜式的…

【数智化CIO展】吉家宠物CIO张志伟:深度挖掘数据价值是数字化发展趋势,才能实现企业精细化运营...

张志伟 本文由吉家宠物CIO张志伟投递并参与由数据猿联合上海大数据联盟共同推出的《2024中国数智化转型升级优秀CIO》榜单/奖项评选。丨推荐企业&#xff1a;观远数据 大数据产业创新服务媒体 ——聚焦数据 改变商业 中国“宠物经济”热潮不断攀升&#xff0c;国内宠物市场的竞…

共享使用模型以节省磁盘空间

如果同时使用了多个工具&#xff08;例如 Easy Diffusion, Stable Diffusion UI, Comfy)&#xff0c;则可以通过共享使用保存在某个目录下的模型文件来节省磁盘空间。 1. Easy Diffusion 在Easy Diffusion中可以创建一个链接文件夹&#xff0c;以便在不同的 Stable Diffusion…

宜选影票特惠电影票api接口需要哪些技术支持?宜选影票api文档

特惠电影票API接口的开发和对接需要一系列技术支持&#xff0c;以确保数据的准确性、接口的稳定性以及用户使用的便捷性。以下是所需的主要技术支持&#xff0c;以清晰的分点表示和归纳&#xff1a; 1. API开发技术 RESTful API&#xff1a;特惠电影票API接口通常采用RESTful…

【UML用户指南】-05-对基本结构建模-类

目录 1、名称&#xff08;name&#xff09; 2、属性 &#xff08;attribute&#xff09; 3、操作&#xff08;operation&#xff09; 4、对属性和操作的组织 4.1、衍型 4.2、职责 &#xff08;responsibility&#xff09; 4.3、其他特征 4.4、对简单类型建模 5、结构良…

Coolmuster iOS 数据擦除:隐私保护的终极方案

手机和平板电脑是我们不可或缺的伙伴&#xff0c;它们存储着我们的照片、联系人、私人消息以及工作文件。然而&#xff0c;当这些设备需要更换或者出售时&#xff0c;如何确保存储在其中的数据不被他人恢复和滥用&#xff0c;成为了一个严峻的问题。Coolmuster iOS 数据擦除&am…

2024年船舶、机械制造与海洋科学国际会议(ICSEMMS2024)

2024年船舶、机械制造与海洋科学国际会议&#xff08;ICSEMMS2024&#xff09; 会议简介 我们诚挚邀请您参加将在重庆隆重举行的2024年国际造船、机械制造和海洋科学大会&#xff08;ICSEMMS024&#xff09;。作为一项跨学科和跨学科的活动&#xff0c;本次会议旨在促进造船…

基于SSM+Jsp的二手手机回收平台系统

开发语言&#xff1a;Java框架&#xff1a;ssm技术&#xff1a;JSPJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包…

作业-day-240605

思维导图 C编程 设计一个Per类&#xff0c;类中包含私有成员:姓名、年龄、指针成员身高、体重 再设计一个Stu类&#xff0c;类中包含私有成员:成绩、Per类对象p1 设计这两个类的构造函数、析构函数。 #include <iostream>using namespace std;class Per{ private:str…

easyexcel模板填充列表

引入依赖 <dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.6</version></dependency>编写模板 编写代码 public class FillData {private String name;private Double number;pu…

Leetcode刷题(四十)

Pow(x, n)&#xff08;Medium&#xff09; 实现 pow(x, n) &#xff0c;即计算 x 的整数 n 次幂函数&#xff08;即&#xff0c;xn &#xff09;。示例 1&#xff1a;输入&#xff1a;x 2.00000, n 10 输出&#xff1a;1024.00000 示例 2&#xff1a;输入&#xff1a;x 2.1…

MySQL—多表查询(概述、基本实操、分类)

一、引言 概述&#xff1a;指的是从多张表中查询数据。 二、实操 打开 DataGrip 进行尝试多表查询。 &#xff08;1&#xff09;表结构的准备以及数据的插入 分别是&#xff1a;员工表 emp 以及 部门表。员工表中字段 dept_id 是外键&#xff0c;关联部门表的主键 id。 em…

J-Lin烧录

1、J-linK介绍 J-Link是由德国SEGGER公司推出的&#xff0c;主要用于支持仿真ARM内核芯片的JTAG仿真器。它支持JTAG和SWD两种模式&#xff0c;可以配合多种集成开发环境&#xff08;如IAR EWAR, ADS, KEIL, WINARM, RealView等&#xff09;使用&#xff0c;支持ARM7/ARM9/ARM…

Lagrange ZK Coprocessor:革新区块链领域的大数据应用

1. 引言 2024年5月11日&#xff0c;Lagrange Labs宣称获得由Founders Fund领投&#xff08;Archetype Ventures, 1kx, Maven11, Fenbushi Capital, Volt Capital, CMT Digital, Mantle Ecosystem Fund和其它天使投资人跟头&#xff09;的1320万美金种子轮融资&#xff0c;致力于…

使用gradio库实现Web应用,允许用户上传图像,并使用YOLOv8模型对图像进行目标检测。

一、Gradio Gradio 详细介绍 Gradio 是一个用于构建和分享机器学习模型和数据科学应用的开源Python库。它简化了创建交互式Web界面的过程&#xff0c;让开发者可以快速搭建原型并与他人分享。 主要特性 易用性&#xff1a; 无需前端开发经验&#xff1a;只需几行Python代码就…

Python dateutil库:日期和时间处理的利器

更多Python学习内容&#xff1a;ipengtao.com Python的dateutil库是一个强大且灵活的日期和时间处理工具。它扩展了标准库中的datetime模块&#xff0c;提供了更多的功能和更高的灵活性。dateutil库特别适用于复杂的日期解析、日期计算、时区转换和重复事件处理。本文将详细介绍…

mysql高级刷题-01-求项目子任务分组计算

这条 SQL 查询用于从 Tasks 表中计算项目的相关信息&#xff0c;并根据项目的总时长进行排序。具体来看&#xff0c;这段查询的目的是将连续的任务分组为一个项目&#xff0c;并计算每个项目的总天数、子任务 ID 列表、项目的开始日期和结束日期。下面是对这条 SQL 查询的详细分…

递归书写树形图示例

大叫好&#xff0c;今天书写了一个扁型转换为树型的例子&#xff0c;使用的是递归&#xff0c;请大家食用&#xff0c;无毒 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" conte…

redis常用设计模式

Redis常用的设计模式分为读&#xff0c;写&#xff0c;读写三种 一、概要说明 读操作 Read Through Pattern 读穿透 写操作 以Redis统一视图为准&#xff1a;先更新缓存&#xff0c;后更新数据库。 Write Through Pattern 直写模式&#xff08;首先将数据写入缓存&#xf…

github删除某个仓库

在GitHub上删除一个仓库&#xff0c;按照以下步骤操作&#xff1a; 1、登录到GitHub账户。 2、导航到想要删除的仓库页面。 3、点击仓库页面上的"Settings"&#xff08;设置&#xff09;选项卡。 4、向下滚动到页面底部&#xff0c;找到"Danger Zone"&…