You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将UART接收的字符拼接成字符串?附示例与代码尝试

如何将UART传入的字符拼接成指定格式的字符串?

看起来你需要处理UART发来的带帧头帧尾的串行数据,把每个帧里的字符去掉空格拼接,最后把多个帧的结果组合起来。我来帮你梳理下解决方案:

需求回顾

UART接收的帧格式:\x02 1 2 3 4 5 6 7 \x03、\x02 a b c d e f g \x03,期望输出:1234567 abcdefg

核心思路

  1. 先识别帧起始符\x02(二进制是b'\x02'),只有收到这个才开始收集数据
  2. 持续接收字节,直到遇到帧结束符\x03,期间过滤掉空格字符
  3. 把每个帧收集到的有效字符拼接成字符串,最后将所有帧结果用空格连接输出

完整实现代码

#!/usr/bin/env python
import time
import serial

# 定义帧起始和结束符(注意是字节类型)
START_CHAR = b'\x02'
END_CHAR = b'\x03'
# 存储所有帧的结果
frame_results = []

try:
    ser = serial.Serial('/dev/ttyUSB0', 38400, timeout=1)
    ser.flushInput()
    ser.flushOutput()
    print("串口已打开,等待数据...")

    while True:
        # 第一步:等待起始符,过滤无效前置字节
        while True:
            byte = ser.read(1)
            if byte == START_CHAR:
                break  # 找到起始符,开始收集当前帧数据

        # 第二步:收集当前帧的有效字符,直到遇到结束符
        current_frame = []
        while True:
            byte = ser.read(1)
            if byte == END_CHAR:
                break  # 找到结束符,当前帧收集完成
            if byte != b' ':  # 跳过空格,只保留有效字符
                # 把字节转成字符串(默认ASCII编码,若用其他编码可替换)
                current_frame.append(byte.decode('ascii'))

        # 拼接当前帧并更新结果列表
        if current_frame:  # 避免空帧干扰
            frame_str = ''.join(current_frame)
            frame_results.append(frame_str)
            # 实时输出所有帧的组合结果
            print(' '.join(frame_results))

except KeyboardInterrupt:
    print("\n程序已退出")
finally:
    if 'ser' in locals() and ser.is_open:
        ser.close()
        print("串口已关闭")

代码细节说明

  • 帧边界识别:通过两层循环分别捕获起始符和结束符,确保只处理合法的完整帧,避免接收混乱的零散字节
  • 数据过滤:收集过程中自动跳过空格,直接提取需要的字符
  • 编码兼容:用decode('ascii')转换字节到字符串,如果你使用的是UTF-8等其他编码,替换对应的参数即可
  • 异常处理:捕获KeyboardInterrupt支持Ctrl+C优雅退出,同时保证串口资源正常释放

测试效果

当UART发送\x02 1 2 3 4 5 6 7 \x03后,程序会输出1234567;接着发送\x02 a b c d e f g \x03,会实时输出1234567 abcdefg,完全匹配你的期望。

内容的提问来源于stack exchange,提问作者Ubaid

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:16:07