串口编程

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

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

硬件

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

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

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

TODO 电气特性 RS-485

软件

使用 Qt 的串口库,拷贝其示例代码,然后根据业务稍作修改即可。

属性默认值:9600,8N1

  • The default value is Baud9600, i.e. 9600 bits per second.
  • The default value is Data8, i.e. 8 data bits.
  • The default value is NoFlowControl, i.e. no flow control.
  • The default value is NoParity, i.e. no parity.
  • The default value is OneStop, i.e. 1 stop bit.

在 Linux 平台打开串口时,确保对目标设备拥有权限。建议使用以下接口判断

  • QSerialPort::SerialPortError error() const
  • QString QIODevice::errorString() const

如果报错权限问题:permission error while locking the device ,
试一试解决办法:删除 /var/lock/LCK..ttyS0 等类似文件。

工具

Windows 下常用的串口调试工具、窗口调试助手,在互联网上能够搜到很多。
可能是因为太简单,或者是定制性太强,并没有一款占据垄断地位的软件。

XShell 和 PuTTY 也支持串口,在调试嵌入式系统的时候就是用的 XShell。
但是 XShell 和 PuTTY 在发送十六进制、以十六进制查看字节上并未做支持,
只能迂回查看,Display Hex in PuTTY for Serial

目前使用的 Microsoft Store 中的“串口调试助手”,
但我要吐槽一句,其他助手 23兆,这款 6070兆的安装包,肯定有坑。

vspd

站在软件开发者的视角,如果每次调试业务时都需要把上下游的串口设备接上才能调试,
无疑是效率很低的,也是愚蠢的。所以我们要想办法甩开硬件串口来调试,我们需要

  1. 软件模拟串口设备,VSPD 虚拟串口工具
  2. 发送内容:有条件直接录取串口数据;没有条件就根据协议自行组装

minicom

linux 平台推荐 minicom ,也只推荐这一款工具。
虽然没有 GUI ,但其作为纯粹的命令行工具,也保证了更广泛的使用场景。
比如 SSH 远程访问在终端中执行,比如离线设备上安装 GUI 助手解决各种依赖很麻烦。

相比图形界面工具,minicom 有一点点的学习成本,但对于熟悉 linux 终端操作的开发者,十分钟上手,半小时熟练使用。

接收串口数据:以十六进制展示 -H,自动换行 -w,开启色彩 -c on
底部状态栏查看状态,按下 Ctrl-A Z 查看帮助,按下 Ctrl-A X 退出 minicom 。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
root@localhost 桌面]$ minicom -Hwc on
root@localhost 桌面]$ minicom --help
Usage: minicom [OPTION]... [configuration]
A terminal program for Linux and other unix-like systems.

-b, --baudrate : set baudrate (ignore the value from config)
-D, --device : set device name (ignore the value from config)
-s, --setup : enter setup mode
....
-w, --wrap : Linewrap on
-H, --displayhex : display output in hex
-z, --statline : try to use terminal's status line
-7, --7bit : force 7bit mode
-8, --8bit : force 8bit mode
-c, --color=on/off : ANSI style color usage on or off
....

串口发送:TODO