0%

QUdpSocket

使用上存在几个注意事项,当其结果不符合预期时看看这里有没有记录。

QUdpSocket::readyRead()

记录一个关于 信号的 bug ,有数据到达但此信号不再 emit :官方相似 bug 描述

其内部实现依赖 hasPendingData 标志位判断是否发出信号(并调用关联的槽函数) ,但此标志位容易出错, Qt 将此标志位的复位操作交给了用户:

Note: An incoming datagram should be read when you receive the readyRead() signal, otherwise this signal will not be emitted for the next datagram.

阅读全文 »

开发 Qt 软件过程中发现折线图(Qt Charts 二维折线图)显示不全、圆环刻度值(QPainter 自绘)显示异常。

上述问题和程序运行时使用的 Qt 版本有关,但和编译时使用的 Qt 版本无关:

  • 项目源码是在 Qt 5.13.2 下构建开发的,未针对 5.12.12 做适配
  • 但使用 Qt 5.12.12 也能够编译成功;
  • 运行时必须使用 Qt 5.13.2 ,如果运行时使用 5.12.12 就会出现上述现象。

使用 Qt 5.13.2 构建的可执行文件,运行时库如果使用 5.12.12 会启动失败,报错:
undefined symbol: qt_resourceFeatureZlib, version Qt_5

在 Qt Creator 中运行、调试项目时,使用的 Qt 版本一般和编译期的版本一致,但我们可以打破这种一致性:

  • 编译时,关闭 QT.global.enabled_features = rpath 特性:此特性在 5.12.12 中默认关闭;在 5.13.2 中默认开启。
  • 运行时,修改 LD_LIBRARY_PATH 使找到的 Qt 运行时库和编译时的库版本不一致

在设备上部署软件后,如何约束运行时使用的 Qt 版本(以及第三方库):

  • 通过 -rpath 特性约束,要求设备上存在对应的目录
  • 通过 LD_LIBRARY_PATH 环境变量约束

可以使用 readelf -d a.out 查看可执行文件是否指定了运行时库的查找路径。

阅读全文 »

搭建环境:

  • Qt 在 Qt5.12.12 之前提供 Windows/Linux/Mac 离线安装包,只有 x86 架构的
  • Qt 目前已经支持 ARM 架构,但只有在线安装包
  • Qt 从源码构建安装,费时费力还容易出错。我还没掌握
  • Qt 在 Linux 还可以通过各系统的软件仓库安装,版本陈旧,也需要联网

软件仓库

系统环境:

1
2
3
4
5
6
7
niel@ubuntu:~$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=20.04
DISTRIB_CODENAME=focal
DISTRIB_DESCRIPTION="Ubuntu 20.04.1 LTS"
niel@ubuntu:~$ uname -a
Linux ubuntu 5.4.0-42-generic #46-Ubuntu SMP Fri Jul 10 00:24:02 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux

克隆仓库需要较大的磁盘空间,下载过程也耗时比较久:

1
2
3
apt install apt-mirror
vim /etc/apt/mirror.list
apt-mirror
阅读全文 »

在 Qt 中虽然存在 QTimeZone 类型,但其官方手册中多次强调了用户不应直接使用 QTimeZone ,而是结合 Qt::TimeSpec 枚举值使用 QDateTime

This class is primarily designed for use in QDateTime; most applications will not need to access this class directly and should instead use QDateTime with a Qt::TimeSpec of Qt::TimeZone.

If you require a QDateTime that uses the current system time zone at any given moment then you should use a Qt::TimeSpec of Qt::LocalTime.

Time Zone Offsets 时差

The total offset is comprised of two component parts, the standard time offset and the daylight-saving time offset. 夏时制

阅读全文 »

在 Qt Creator 如何运行终端程序呢?

在项目的 Build & Run 配置中,勾选 Run in terminal 即可。

选中 Run in terminal 之前,应用程序 Run in 哪里呢?

通过 Windows 任务管理器查看,勾选后作为 qtcreator_process_stub.exe (和 Qt Creator 进程同级别)的子进程运行,没有勾选的话作为 Qt Creator 的子进程运行。

Qt 的日志框架

最常用的函数: qDebug(const char *message, ...)

Calls the message handler with the debug message message.

  • If no message handler has been installed, the message is printed to stderr.
  • Under Windows the message is sent to the console, if it is a console application; otherwise, it is sent to the debugger.
  • On QNX, the message is sent to slogger2.
  • This function does nothing if QT_NO_DEBUG_OUTPUT was defined during compilation.
阅读全文 »

我们在谈到“串口”的时候,往往还会提到 RS-232 、RS-485 等等,它们之间的关系是什么?

串行端口 的概念,是和 并行端口 相对的。串口一次只传输 1bit ,但并行端口会同时传输多个 bit 。

通信,传输字符/字节。

历史上字节长度曾基于硬件为 1-48 bit不等,最初通常使用6 bit 或9 bit 为一字节。今日标准以 8 bit 作为一字节。

虽然以太网、FireWire 和 USB 等接口也以串行流的形式发送数据,但术语 串行端口 通常表示符合 RS-232 或相关标准(如 RS-485 或 RS-422)的硬件。

我们可能会用到 232 串口线、或者 422 串口线连接两个设备,但使用 Qt serial port 模块写软件不用考虑使用了哪种串口线,只需要关注收发两端的波特率、校验位、停止位等一致。

The most well-known options are

  • speed,
  • number of data bits per character,
  • parity, and
  • number of stop bits per character.

硬件

RS-232 是美国电子工业联盟制定的串行数据通信的接口标准,它广泛用于计算机串行接口外设连接。

它规定连接电缆和机械、电气特性、信号功能及发送过程。其他常用电气标准还有 RS-422-A、RS-423A、RS-485。

出于节省资金和空间的考虑,25 个管脚的 DB-25 连接器已经不常见,9 个管脚的 DB-9 型连接器被广泛使用。RS-232 中 DB-9 型连接器的信号和管脚分配:2-收,3-发,5-接地。

阅读全文 »

从桌面开发突然进入 VxWorks 嵌入式开发,有几个认知上的调整:

  1. 桌面开发的时候,驱动、操作系统和 IDE 之后,我们才开始新建项目、编写代码;
  2. 嵌入式开发,从板级支持包、系统镜像就需要新建对应的项目了。
  3. 理解嵌入式系统可裁剪,镜像大概率并不支持那些在桌面操作系统上常见的指令、服务和开发所需的库,需要有针对性的一个一个配置相应的驱动、组件。

Das U-Boot

加载桌面操作系统之前的引导阶段,按下任意键进入 BIOS。与之类似,我们在板子引导程序读秒期间(使用串口调试工具)发送任意键能够进入 uboot,使用 printenv 等命令查看状态。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 查看版本
version
# 获取帮助
help
?
# 打印环境变量
printenv
# 查询 FAT 格式设备的目录和文件信息
fatls scsi 0:8
fatls scsi 0:1
# bootcmd 自动启动时执行命令
setenv bootcmd "fatload scsi 0:1 0x90100000 Ft2004.elf; bootvx32 0x90100000;"
saveenv
# 查看日期时间
date
# 查看帮助
help date

# 更多
fatinfo - print information about filesystem
fatload - load binary file from a dos filesystem
fatls - list files in a directory (default /)
阅读全文 »

FTP 通信分为主动 active 被动 PASV 模式。

FTP 通信会占用两个 TCP 通道:一个用于命令,一个用于数据。

主动、被动是站在(响应命令的)服务端的角度来说:
FTP 客户端首先向服务端 21 端口发送命令,然后

  • (最初只有)主动模式:客户端启动端口,服务端连接
  • (解决痛点)被动模式:服务端启动端口,客户端连接

windows 平台下 cmd/powershell 中的 ftp 命令不支持被动模式,文件管理器支持被动模式。

阅读全文 »

摘抄自《计算机网络(第7版)-谢希仁》教材,读书笔记。

OSI 的七层协议体系结构的概念清楚,理论也较完整,但它既复杂又不实用。

TCP/IP 的体系结构则不同,但它现在却得到了非常广泛的应用。TCP/IP 是一个四层的体系结构,它包含应用层、运输层、网际层和网络接口层(用网际层这个名字是强调这一层是为了解决不同网络的互连问题)。不过从实质上将,TCP/IP 只有最上面的三层,因为最下面的网络接口层并没有什么具体内容。

互联网是由大量的异构(heterogeneous)网络通过路由器(router)相互连接起来的。互联网使用的网络层协议是无连接的网际协议 IP(Internet Protocol) 和许多种路由选择协议,因此互联网的网络层也叫做网际层或 IP 层。

链路层

局域网虽然是个网络,但我们并不把局域网放在网络层中讨论。这是因为在网络层要讨论的问题是多个网络互联的问题,是讨论分组(packet)怎样从一个网络,通过路由器,转发到另一个网络。在本章中我们研究的是在同一个局域网中,分组(packet)怎样从一台主机传送到另一台主机,但并不经过路由器转发。从整个互联网来看,局域网仍属于数据链路层的范围。

packet 小包裹、信息包,在教材中一般翻译为“分组”,但“分组”在日常对话中多理解成动词,给读者造成困扰。分组:

阅读全文 »