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


    注意:


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


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

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

    实现收发消息数的显示:

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

    修改代码:

    1. void Widget::on_btnSendContext_clicked()
    2. {
    3. const char * sendData = ui->lineEdit_SendContext->text().toStdString().c_str();//QString->String(C++)->char*
    4. int writeCnt = 0;
    5. writeCnt = serialPort->write(sendData);
    6. if(writeCnt == - 1){
    7. ui->label_SendStatus->setText("SendError!");
    8. }
    9. else {
    10. writeCntTotal += writeCnt;
    11. qDebug()<<"Send:"<
    12. qDebug()<<"writeCnt"<
    13. ui->label_SendStatus->setText("SendOK!");
    14. ui->label_SendCnt->setNum(writeCntTotal);
    15. if(strcmp(sendData,sendBak.toStdString().c_str())!=0){ //只有当数据与上一次不相等的时候我们才会追加到我们的历史发生中
    16. ui->textEditRecord->append(sendData);
    17. sendBak = QString(sendData);
    18. }
    19. }
    20. }
    21. void Widget::on_SerialData_readToRead()
    22. {
    23. QString recvMessage = serialPort->readAll();
    24. if(recvMessage != NULL){
    25. qDebug()<<"get Message: "<
    26. ui->textEditRev->append(recvMessage);
    27. readCntTotal += recvMessage.size();
    28. qDebug()<<"readCnt"<size();
    29. ui->label_RecvCnt->setNum(readCntTotal);
    30. }
    31. }

    输出效果

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

    添加关闭/打开按钮功能

    添加打开失败的判断:QMessageBox

    添加代码

    效果图


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


     

    1. void Widget::on_btnCloseOrOpenSerial_clicked()
    2. {
    3.     if(!serialStatus){ //串口没有被打开  --> 配置参数,打开串口
    4. //    1.选择端口号
    5.      serialPort->setPortName(ui->comboBox_serialNum->currentText());
    6. //    2.配置波特率   注意把String ->int
    7.      serialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
    8. //    3.配置数据位
    9.      serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
    10. //    4.配置校验位
    11.      switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配
    12.      {
    13.       case 0:
    14.          serialPort->setParity(QSerialPort::NoParity);
    15.          break;
    16.      case 1:
    17.         serialPort->setParity(QSerialPort::EvenParity);
    18.         break;
    19.      case 2:
    20.        serialPort->setParity(QSerialPort::MarkParity);
    21.         break;
    22.      case 3:
    23.         serialPort->setParity(QSerialPort::OddParity);
    24.         break;
    25.      case 4:
    26.         serialPort->setParity(QSerialPort::SpaceParity);
    27.         break;
    28.      default:
    29.          serialPort->setParity(QSerialPort::UnknownParity);
    30.          break;
    31.      }
    32. //    5.配置停止位
    33.      serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
    34. //    6.流控
    35.      if(ui->comboBox_fileCon->currentText() == "None")
    36.            serialPort->setFlowControl(QSerialPort::NoFlowControl);
    37.     // 配置完毕,打开串口
    38.     if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回true
    39.     qDebug()<<"serial open success!";
    40.     //打开串口后这些串口参数就不可以设置了
    41.     ui->comboBox_dataBit->setEnabled(false);
    42.     ui->comboBox_fileCon->setEnabled(false);
    43.     ui->comboBox_stopBit->setEnabled(false);
    44.     ui->comboBox_Baudrate->setEnabled(false);
    45.     ui->comboBox_checkBit->setEnabled(false);
    46.     ui->comboBox_serialNum->setEnabled(false);
    47.      ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送
    48.     ui->btnCloseOrOpenSerial->setText("关闭串口");
    49.     serialStatus  = true; // 打开成功,设置状态
    50.     }
    51.     //打开失败,给出提示
    52.     else{
    53.         QMessageBox msgBox;
    54.         msgBox.setWindowTitle("打开串口错误!");
    55.         msgBox.setText("打开失败,串口可能占用被拔出");
    56.         msgBox.exec();
    57.     }
    58.   }
    59.   else{ // if 串口已经打开我们就关闭串口,并且让 参数可选
    60.   serialPort->close(); // 关闭串口
    61.   serialStatus = false; // 关闭成功,设置状态
    62.   ui->btnCloseOrOpenSerial->setText("打开串口");
    63.   ui->comboBox_dataBit->setEnabled(true);
    64.   ui->comboBox_fileCon->setEnabled(true);
    65.   ui->comboBox_stopBit->setEnabled(true);
    66.   ui->comboBox_Baudrate->setEnabled(true);
    67.   ui->comboBox_checkBit->setEnabled(true);
    68.   ui->comboBox_serialNum->setEnabled(true);
    69.   ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送
    70.     }
    71. }

    效果展示
     

    setEnable  --  设置comboBox 是否可变

     

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



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


    先 √ checkbool

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



     

    1. void Widget::on_btnCloseOrOpenSerial_clicked(bool checked)
    2. {
    3.     if(!checked){ //串口没有被打开  --> 配置参数,打开串口
    4. //    1.选择端口号
    5.      serialPort->setPortName(ui->comboBox_serialNum->currentText());
    6. //    2.配置波特率   注意把String ->int
    7.      serialPort->setBaudRate(ui->comboBox_Baudrate->currentText().toInt());
    8. //    3.配置数据位
    9.      serialPort->setDataBits(QSerialPort::DataBits(ui->comboBox_dataBit->currentText().toInt()));
    10. //    4.配置校验位
    11.      switch (ui->comboBox_checkBit->currentIndex()) // 根据下标来匹配
    12.      {
    13.       case 0:
    14.          serialPort->setParity(QSerialPort::NoParity);
    15.          break;
    16.      case 1:
    17.         serialPort->setParity(QSerialPort::EvenParity);
    18.         break;
    19.      case 2:
    20.        serialPort->setParity(QSerialPort::MarkParity);
    21.         break;
    22.      case 3:
    23.         serialPort->setParity(QSerialPort::OddParity);
    24.         break;
    25.      case 4:
    26.         serialPort->setParity(QSerialPort::SpaceParity);
    27.         break;
    28.      default:
    29.          serialPort->setParity(QSerialPort::UnknownParity);
    30.          break;
    31.      }
    32. //    5.配置停止位
    33.      serialPort->setStopBits(QSerialPort::StopBits(ui->comboBox_stopBit->currentData().toInt()));
    34. //    6.流控
    35.      if(ui->comboBox_fileCon->currentText() == "None")
    36.            serialPort->setFlowControl(QSerialPort::NoFlowControl);
    37.     // 配置完毕,打开串口
    38.     if(serialPort->open(QIODevice::ReadWrite)){ // open -- 能成功打开,返回true
    39.     qDebug()<<"serial open success!";
    40.     //打开串口后这些串口参数就不可以设置了
    41.     ui->comboBox_dataBit->setEnabled(false);
    42.     ui->comboBox_fileCon->setEnabled(false);
    43.     ui->comboBox_stopBit->setEnabled(false);
    44.     ui->comboBox_Baudrate->setEnabled(false);
    45.     ui->comboBox_checkBit->setEnabled(false);
    46.     ui->comboBox_serialNum->setEnabled(false);
    47.      ui->btnSendContext->setEnabled(true); //串口打开成功,允许发送
    48.     ui->btnCloseOrOpenSerial->setText("关闭串口");
    49.    // serialStatus  = true; // 打开成功,设置状态
    50.     }
    51.     //打开失败,给出提示
    52.     else{
    53.         QMessageBox msgBox;
    54.         msgBox.setWindowTitle("打开串口错误!");
    55.         msgBox.setText("打开失败,串口可能占用被拔出");
    56.         msgBox.exec();
    57.     }
    58.   }
    59.   else{ // if 串口已经打开我们就关闭串口,并且让 参数可选
    60.   serialPort->close(); // 关闭串口
    61.  // serialStatus = false; // 关闭成功,设置状态
    62.   ui->btnCloseOrOpenSerial->setText("打开串口");
    63.   ui->comboBox_dataBit->setEnabled(true);
    64.   ui->comboBox_fileCon->setEnabled(true);
    65.   ui->comboBox_stopBit->setEnabled(true);
    66.   ui->comboBox_Baudrate->setEnabled(true);
    67.   ui->comboBox_checkBit->setEnabled(true);
    68.   ui->comboBox_serialNum->setEnabled(true);
    69.   ui->btnSendContext->setEnabled(false); //串口关闭,无法向串口发送
    70.     }
    71. }

  • 相关阅读:
    《痞子衡嵌入式半月刊》 第 62 期
    word插入公式/endnote
    Shell判断:模式匹配:case(二)
    请问哪家淘宝/天猫店 您家的是真的 STM32F103C8T6系统板?
    工业物联网关-整体框架
    【HBZ分享】ES中的DLS命令使用
    Anaconda中配置PyTorch环境——win10系统(小白包会)
    [“1“, “2“, “3“].map(parseInt) 答案是多少
    Mysql(一) 索引底层数据结构
    【C++入门】拷贝构造&&运算符重载
  • 原文地址:https://blog.csdn.net/mx_jun/article/details/139388495