Qt5学习笔记之串口助手四:增加16进制/ASCII切换周期发送

Posted 何事误红尘

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Qt5学习笔记之串口助手四:增加16进制/ASCII切换周期发送相关的知识,希望对你有一定的参考价值。

目录

1. 概述

距离上次起意学习Qt已经过去了好久,最近又萌生了自己写工具的想法。真的是间歇性踌躇满志,持续性混吃等死。。。
前面跟着课程做了个串口工具的demo,实现简单的收发。这个工具还很简陋,无法满足正常使用。本文开始,为串口工具增加日常使用频率比较高的一些功能,如16进制/ASCII发送、周期发送、接收16进制/ASCII显示等。
先逐渐实现各个功能,最后再对界面进行重新布局。明确实现哪些功能–>调整界面布局–>依次实现功能,这样更好。不过自己学习嘛,想到啥功能就添加啥功能,天马星空,随意就好。

2. 16进制/ASCII发送

Qt5学习笔记之串口助手一文的最后,测试我们输入的内容是以ASCII发送的。实际上输入的FF FF 4E 04 00 18 00 00 56 FF是我们的自定义协议,需要按照16进制发送。

2.1 功能实现

QLineEdit是QString,也就是需要把QString转换为16进制数组,搜索了一下,好像没有专门的函数,不少人贴出自己的实现方式(如Qt字节数组和十六进制的相互转换)。我的想法是:

  1. 指令之间不输入空格,使用循环,每次裁剪len=2的小字符串,转换成16进制。
    QString str1;
    str1 = str.mid(2 * i, 2);
    
  2. 考虑到有空格,输入更加直观。可以每次按照空格来切割字符串,就可以得到len=2的小字符串,分别转换成16进制。
    QString str1;
    str1 = str.section(' ', i, i);
    
  3. 记录另一种切割方式
    QStringList list1;
    int x, y, z;
    list1 = str.split(' ');
    x = list1 .at(0).toInt();
    x = list1 .at(1).toInt();
    x = list1 .at(2).toInt();
    

一边搜一边写,然后就发现不必自己实现。。。。

void Widget::on_sendBt_clicked()

    //serialPort->write(ui->sendEdit->text().toLocal8Bit().data());
    serialPort->write(QByteArray::fromHex(ui->sendEdit->text().toLatin1().data()));


参考链接:
Qt - 关于QByteArray存储十六进制 与十六进制互转
QString的toLocal8bit与toLatin1的区别
【QT】QString类型转换为const char*(toLatin1)

2.2 界面修改

界面上增加一个选择框,让使用者能够根据实际情况选择以16进制还是ASCII码发送。
选择框

3. 接收框显示发送内容

使用过程中,我们更希望在

3.1 以16进制/ASCII显示

转换为16进制

3.1.1 界面修改

3.1.2 功能实现

收到一帧数据,则发送回去
增加数据解析,

3.2 支持更多编码格式

暂不实现,占个位置。

4. 增加时间戳

增加时间戳,Qt5学习笔记之计时器一文中已经实现过,

4.1 界面修改

4.2 功能实现

5. 增加周期发送

5.1 界面修改

界面增加周期发送选项和周期设置

5.2 功能实现

以上是关于Qt5学习笔记之串口助手四:增加16进制/ASCII切换周期发送的主要内容,如果未能解决你的问题,请参考以下文章

请教高人,ARDUINO如何代替串口助手发16进制数据

串口助手怎么既显示16进制数有显示汉字??

串口调试助手-发送数据,按字符或16进制显示接收数据的C#程序

串口助手如何不带空格发送

Qt Widget 之简易串口助手(QSerialPort)

C# 学习笔记(13)自己的串口助手