- 配置串口本身的命令:如何在计算机上设置串口参数。
- 应用层的数据/命令协议:如何定义和发送有效的指令来控制设备。
- 常用设备的命令示例:一些典型设备的实际命令格式。
配置串口本身的命令 (在计算机端)
在发送任何有效数据之前,必须确保计算机和设备两端的串口参数完全一致,这些参数通常通过终端软件(如 PuTTY, Tera Term, SecureCRT, sscom 等)或编程语言(如 Python, C++, C#)来设置。

核心的配置参数包括:
| 参数 | 中文名 | 说明 | 常用值 |
|---|---|---|---|
| Baud Rate | 波特率 | 每秒传输的比特数,必须两端严格一致。 | 9600, 19200, 38400, 115200 |
| Data Bits | 数据位 | 每个数据帧中实际包含的数据比特数。 | 8 (最常用) |
| Parity | 校验位 | 用于简单的错误检测。 | None (无校验), Odd (奇校验), Even (偶校验) |
| Stop Bits | 停止位 | 标识一个数据帧的结束。 | 1 (最常用), 2 |
| Flow Control | 流控制 | 用于防止数据丢失的握手机制。 | None (无流控), Hardware (硬件流控, RTS/CTS), Software (软件流控, XON/XOFF) |
如何配置?
-
使用终端软件:打开软件,选择对应的COM口,在设置或配置菜单中修改上述参数,然后点击“连接”或“打开”。
-
使用编程语言 (以Python为例):
(图片来源网络,侵删)import serial # 创建串口对象 ser = serial.Serial( port='COM3', # 端口号 baudrate=9600, # 波特率 bytesize=serial.EIGHTBITS, # 数据位 parity=serial.PARITY_NONE, # 校验位 stopbits=serial.STOPBITS_ONE, # 停止位 timeout=1, # 读超时时间(秒) xonxoff=False, # 软件流控 rtscts=False, # 硬件流控 dsrdtr=False # 硬件流控 ) if ser.is_open: print(f"串口 {ser.name} 已成功打开")
应用层的数据/命令协议
这是串口通信的核心,即我们发送什么内容来让设备执行特定操作,一个好的协议应该清晰、健壮、易于解析。
命令的基本结构
一个完整的命令通常包含以下几个部分:
[起始符] [命令字/地址] [数据] [校验和] [结束符]
- 起始符:用于接收方识别一个新命令的开始。
0x7B() 或0x02(STX)。 - 命令字/地址:唯一标识一个操作。
0x01表示“读取温度”,0x02表示“设置开关”。 - 数据:命令附带的具体参数,例如设置开关状态为“开”,数据就是
0x01。 - 校验和:确保数据在传输过程中没有出错,常用方法有累加和、异或和、CRC16等。
- 结束符:用于接收方识别一个命令的结束。
0x0D 0x0A(\r\n) 或0x7D()。
协议设计示例
假设我们要设计一个控制LED灯的简单协议:

- 功能:打开或关闭指定地址的LED灯。
- 地址:0x01 (LED1), 0x02 (LED2)
- 状态:0x00 (关闭), 0x01 (打开)
协议格式:{CMD,ADDR,STATUS,CHECKSUM}\r\n
示例1:打开LED1
- 命令字:
0x01(表示设置LED) - 地址:
0x01(LED1) - 状态:
0x01(打开) - 数据部分:
0x01+0x01=0x02 - 校验和:
0x02(简单累加和) - 最终发送的十六进制数据:
7B 01 01 01 02 7D 0D 0A7B->01-> CMD01-> ADDR01-> STATUS02-> CHECKSUM7D->0D 0A->\r\n
数据格式:ASCII vs. HEX
在发送命令时,数据可以以两种形式发送:
-
ASCII格式 (文本格式)
- 优点:直观,易于在终端软件中调试和观察,人类可读。
- 缺点:占用字节多,传输效率相对较低。
- 示例:上面的LED命令,可以直接发送字符串
"LED1,ON\r\n"或者"LED1,1\r\n",设备端需要编写字符串解析函数。
-
HEX格式 (十六进制/二进制格式)
- 优点:紧凑,传输效率高,是设备间通信的主流方式。
- 缺点:不直观,调试时需要使用支持HEX显示的终端。
- 示例:上面的LED命令,发送
0x7B, 0x01, 0x01, 0x01, 0x02, 0x7D, 0x0D, 0x0A这样的十六进制字节流。
如何在终端软件中发送? 大多数终端软件都提供了两种模式:
- ASCII/Text模式:直接输入文本,软件会自动将其转换为对应的字节流并发送。
- HEX模式:直接输入十六进制数(如
7B 01 01 01 02 7D 0D 0A),软件会直接发送这些字节。
常用设备的命令示例
不同设备有不同的指令集,但都遵循类似的协议设计原则。
单片机 (如基于STM32/AVR)
- 特点:通常需要自己定义协议,指令非常简单,直接控制GPIO或寄存器。
- 示例 (自定义协议):
SET_LED1_ON\r\n-> ASCII格式,单片机通过字符串匹配执行。0xA5 0x5A 0x01 0x01 0x00 0xE6-> HEX格式,A5 5A是帧头,01是命令,01 00是数据,E6是校验和。
GPS模块 (如NEO-6M)
- 特点:通常遵循标准协议,最常见的是 NMEA 0183。
- 命令格式:以开头,以
\r\n是ASCII格式。 - 示例:
- 查询位置信息:模块会周期性地主动发送
$GPGGA, ...语句。 - 配置模块:发送命令
\$PMTK314,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0*28\r\n来仅输出GGA和RMC语句。\$:转义后的符号。PMTK:厂商命令前缀 (Piksi Multi-TK)。314:命令ID。,0,1,...:参数列表。*28:校验和 (从到前所有字符的异或和)。\r\n:结束符。
- 查询位置信息:模块会周期性地主动发送
4G/ESP8266 Wi-Fi模块
- 特点:通常使用 AT指令集 进行配置和控制,指令是纯文本,以
\r\n- 示例:
- 查询模块状态:
AT\r\n(模块应回复OK\r\n) - 连接Wi-Fi:
AT+CWJAP="Your_SSID","Your_Password"\r\n - 建立TCP连接:
AT+CIPSTART="TCP","192.168.1.100",8080\r
- 示例:
PLC (可编程逻辑控制器) 或 变频器
- 特点:工业领域,协议非常严谨,常用 Modbus RTU (一种基于串口的二进制协议)。
- 命令格式:二进制HEX格式,包含设备地址、功能码、数据地址、数据和CRC校验。
- 示例 (读取保持寄存器):
- 要读取设备地址为
1的PLC,从寄存器地址0开始,读取2个寄存器的值。 - 主机发送:
01 03 00 00 00 02 CRC_L CRC_H01: 从机地址03: 功能码 (读保持寄存器)00 00: 起始地址00 02: 读取数量CRC_L CRC_H: CRC16校验码
- 从机回复:
01 03 04 12 34 56 78 CRC_L CRC_H01 03 04: 从机地址、功能码、数据字节数12 34 56 78: 实际读取到的两个寄存器的值 (4个字节)
- 要读取设备地址为
总结与最佳实践
- 先配置,再通信:确保波特率、数据位等所有参数在两端完全一致。
- 定义清晰的协议:为你的项目设计一个包含起始符、命令、数据、校验和、结束符的协议。
- 添加校验机制:在嘈杂的电气环境中,数据错误难以避免,校验和是必须的。
- 使用HEX格式:对于设备间的通信,优先使用紧凑的HEX格式,效率更高。
- 善用终端软件:使用支持HEX/ASCII切换、自动发送/接收的终端软件进行调试,能极大提高效率。
- 注意超时处理:在编程时,务必设置串口超时,防止程序因等待不存在的响应而卡死。
希望这份详细的指南能帮助您更好地理解和使用串口通信命令!
