菜鸟科技网

串口通信命令有哪些?

  1. 配置串口本身的命令:如何在计算机上设置串口参数。
  2. 应用层的数据/命令协议:如何定义和发送有效的指令来控制设备。
  3. 常用设备的命令示例:一些典型设备的实际命令格式。

配置串口本身的命令 (在计算机端)

在发送任何有效数据之前,必须确保计算机和设备两端的串口参数完全一致,这些参数通常通过终端软件(如 PuTTY, Tera Term, SecureCRT, sscom 等)或编程语言(如 Python, C++, C#)来设置。

串口通信命令有哪些?-图1
(图片来源网络,侵删)

核心的配置参数包括:

参数 中文名 说明 常用值
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为例)

    串口通信命令有哪些?-图2
    (图片来源网络,侵删)
    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灯的简单协议:

串口通信命令有哪些?-图3
(图片来源网络,侵删)
  • 功能:打开或关闭指定地址的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 0A
    • 7B ->
    • 01 -> CMD
    • 01 -> ADDR
    • 01 -> STATUS
    • 02 -> CHECKSUM
    • 7D ->
    • 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-FiAT+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_H
      • 01: 从机地址
      • 03: 功能码 (读保持寄存器)
      • 00 00: 起始地址
      • 00 02: 读取数量
      • CRC_L CRC_H: CRC16校验码
    • 从机回复: 01 03 04 12 34 56 78 CRC_L CRC_H
      • 01 03 04: 从机地址、功能码、数据字节数
      • 12 34 56 78: 实际读取到的两个寄存器的值 (4个字节)

总结与最佳实践

  1. 先配置,再通信:确保波特率、数据位等所有参数在两端完全一致。
  2. 定义清晰的协议:为你的项目设计一个包含起始符、命令、数据、校验和、结束符的协议。
  3. 添加校验机制:在嘈杂的电气环境中,数据错误难以避免,校验和是必须的。
  4. 使用HEX格式:对于设备间的通信,优先使用紧凑的HEX格式,效率更高。
  5. 善用终端软件:使用支持HEX/ASCII切换、自动发送/接收的终端软件进行调试,能极大提高效率。
  6. 注意超时处理:在编程时,务必设置串口超时,防止程序因等待不存在的响应而卡死。

希望这份详细的指南能帮助您更好地理解和使用串口通信命令!

分享:
扫描分享到社交APP
上一篇
下一篇