Qt学习日记|串口通信小工具设计实验

一、串口通信相关知识点

1.QSerialPortInfo辅助类

静态函数:[static] QList<QSerialPortInfo> QSerialPortInfo::availablePorts();

用法示例:

foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
       ui->uartNumComboBox->addItem(info.portName());
    }

我的疑惑:它给到的两个参数都没有被调用,是foreach的特殊功能吗?

2.QSerialPort

使用该类之前需要在项目的.pro文件中添加代码QT+=serialport,其作用是导入serialport模块,然后才可以正常使用。

之前只是用core模块,原来在库之外还有模块。

3.串口通信的基本流程

获取设备串口号-配置串口-打开串口-数据通信

二、阅读代码

QObject::connect(mSerialPort, &QSerialPort::readyRead, this, &MainWindow::readSerial); 

这是Qt框架中的一段代码,用于连接信号和槽。

`QObject::connect()`函数是Qt中用于连接信号和槽的函数。它接受四个参数:第一个参数是要连接的信号,第二个参数是发送信号的对象,第三个参数是接收信号的对象,第四个参数是接收信号的槽函数。

在这段代码中,`mSerialPort`是一个`QSerialPort`对象,表示一个串口设备。`&QSerialPort::readyRead`是`mSerialPort`对象的一个信号,当串口准备好读取数据时,这个信号会被发出。`this`是当前对象的指针,表示当前对象。`&MainWindow::readSerial`是当前对象(即`MainWindow`类)的一个槽函数,名为`readSerial`。

所以,这段代码的意思是:当`mSerialPort`对象的`readyRead`信号被发出时,调用当前对象(即`MainWindow`类)的`readSerial`槽函数。

他的信号和槽函数没有(),让我怔了一下,什么能做信号和槽呢?查到它就是一个槽函数,只是这样表示不太熟悉。

packDout += QString::number(dataTempList.at(i), 16).right(4) + " "; 

这段代码的作用是将`dataTempList`列表中第`i`个元素的值转换为16进制字符串,并取其右边的4位字符,然后将这个子字符串添加到`packDout`字符串的末尾。

具体解释如下:
- `QString::number(dataTempList.at(i), 16)`将`dataTempList`列表中第`i`个元素的值转换为16进制字符串表示。
- `.right(4)`是字符串截取操作,它返回从右侧开始的第4个字符及其后面的所有字符组成的子字符串。
- `+ " "`将子字符串与一个空格连接起来,用于在最终结果中分隔各个子字符串。
- `packDout += ...`将每个子字符串追加到`packDout`字符串的末尾。

因此,整个表达式的目的是将`dataTempList`列表中的元素逐个转换为16进制字符串,并将它们以空格分隔的形式拼接到`packDout`字符串中。

QByteArray

`QByteArray`是Qt框架中的一个类,它用于处理二进制数据。

`QByteArray`类提供了一系列方法来操作二进制数据,包括数据的读取、写入、查找、替换等操作。它还支持对二进制数据进行编码和解码,例如Base64编码和解码。

使用`QByteArray`类可以方便地处理字节数组,而不需要关心底层的内存管理。它提供了一种简洁高效的方式来处理二进制数据,并且可以在不同平台之间移植。

QMessageBox::about(nullptr, "提示", "串口无法打开\r\n不存在或已被占用");

这段代码是Qt框架中的一个函数调用,用于显示一个关于对话框。

`QMessageBox::about()`是一个静态函数,它接受三个参数:第一个参数是对话框的父窗口对象,这里传入了`nullptr`表示没有父窗口;第二个参数是对话框的标题,这里传入了"提示";第三个参数是要显示的消息内容,这里传入了"串口无法打开\r\n不存在或已被占用"。

`\r\n`表示换行符,用于在消息内容中换行。

因此,这段代码的作用是在没有父窗口的情况下,弹出一个标题为"提示"、内容为"串口无法打开\r\n不存在或已被占用"的关于对话框。这个对话框是模态的。

为什么一个十六进制占4位?

一个十六进制数占用四个二进制位,因为**十六进制的基数是16,而二进制的基数是2,且16等于2的四次方(2^4)**。

在数字系统中,十六进制和二进制都是信息表示的方式,但它们基于不同的数制。二进制系统使用两个数码0和1来表示数据,而十六进制系统使用0-9以及A-F共16个数码来表示数据。由于十六进制的每一位可以表示从0到F的十六个数,相当于二进制的四位所能表示的范围(从0000到1111),因此一位十六进制数正好对应四位二进制数。这种对应关系使得十六进制在计算机科学中特别有用,因为它提供了一种比二进制更为简洁、易于理解和操作的数据表示方式。例如,一个字节由8位二进制组成,可以表示为两个十六进制数字。

此外,十六进制的使用也简化了计算机编程和内存地址的读取。在编程时,程序员经常使用十六进制来表示颜色代码、内存地址或其它需要紧凑格式的数据。同时,在错误诊断和性能调优中,十六进制能够提供清晰的数据视图,帮助快速定位问题。

总的来说,十六进制之所以在计算机领域得到广泛应用,主要是因为它与二进制之间的转换既简单又直观,大大提高了处理和理解复杂数据的效率。

unpackRslt += QString("%1").arg(mPackAfterUnpack.at(j), 2, 16, QLatin1Char('0')) + " ";

这段代码是用于将一个整数(mPackAfterUnpack.at(j))转换为16进制字符串,并将其添加到unpackRslt字符串中。具体解释如下:

1. `QString("%1").arg(mPackAfterUnpack.at(j), 2, 16, QLatin1Char('0'))`:这部分代码使用QString的arg()函数将整数mPackAfterUnpack.at(j)转换为16进制字符串。其中,2表示输出的最小宽度为2,16表示使用16进制表示,QLatin1Char('0')表示使用0填充不足的部分。

2. `+ " "`:这部分代码将转换后的16进制字符串与空格字符连接起来。

3. `unpackRslt += ...`:这部分代码将连接后的字符串添加到unpackRslt字符串中。

PlainTextEdit和TextEdit有什么区别吗?

**QPlainTextEdit主要用于编辑和显示纯文本,而QTextEdit则支持编辑和显示纯文本以及富文本**。具体区别如下:

- **QPlainTextEdit**:这个类是一个高级的查看器/编辑器,它被优化用于处理大型文档,并且能够快速响应用户输入。它不支持文本格式,如粗体、斜体或下划线等,这使得它在处理大量文本时效率更高。
- **QTextEdit**:与QPlainTextEdit相比,QTextEdit不仅支持纯文本,还支持富文本的编辑和显示。这意味着QTextEdit可以显示HTML格式的文本,允许用户使用各种文本格式,如字体样式、颜色和超链接等。

综上所述,如果需要一个简单的文本编辑器或者查看器,不需要复杂的文本格式化功能,那么QPlainTextEdit可能是一个更好的选择。相反,如果需要支持文本格式化,比如在文档中加入不同的字体样式和颜色,那么QTextEdit将是更合适的选择。

QWidget和QMainWindow有什么区别

QWidget和QMainWindow在Qt框架中都是基本的窗口类,但它们之间存在一些关键的区别。具体分析如下:

1. **功能**:QWidget是所有用户界面对象的基类,它提供了基本的应用程序构建块,如按钮、文本框等。它是一个可以包含其他窗口组件的通用窗口组件。而QMainWindow是一个更高级的窗口类,它继承自QWidget,并内置了一些常见的界面元素,如菜单栏、工具栏和状态栏。
2. **用途**:QWidget通常用作创建其他控件或容器的基础,它的通用性使得它可以用于各种用户界面元素的开发。而QMainWindow特定于应用程序的主窗口,通常包含应用程序的主要功能和导航元素,如菜单和工具栏。
3. **复杂性**:QMainWindow通常比QWidget更复杂,因为它包含更多的组件和功能,如菜单栏、工具栏、状态栏和dock widgets等。而QWidget则相对简单,主要用于构建基本的界面元素。

总的来说,QWidget提供了一个基础的平台,用于构建用户界面的各个部分,而QMainWindow则提供了一个完整的主窗口框架,包括了菜单、工具栏等高级功能。在选择使用哪个类时,需要根据应用程序的需求和目标来决定。如果需要一个具有完整功能的主窗口,QMainWindow是一个更好的选择;如果只需要构建简单的用户界面元素,QWidget则足够使用。

  • 20
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值