如何将UART接收的字符拼接成字符串?附示例与代码尝试
如何将UART传入的字符拼接成指定格式的字符串?
看起来你需要处理UART发来的带帧头帧尾的串行数据,把每个帧里的字符去掉空格拼接,最后把多个帧的结果组合起来。我来帮你梳理下解决方案:
需求回顾
UART接收的帧格式:\x02 1 2 3 4 5 6 7 \x03、\x02 a b c d e f g \x03,期望输出:1234567 abcdefg
核心思路
- 先识别帧起始符
\x02(二进制是b'\x02'),只有收到这个才开始收集数据 - 持续接收字节,直到遇到帧结束符
\x03,期间过滤掉空格字符 - 把每个帧收集到的有效字符拼接成字符串,最后将所有帧结果用空格连接输出
完整实现代码
#!/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
相关产品推荐
相关产品推荐

