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

PySerial读取FPGA UART输出的ADC数据不更新问题求助

问题:PySerial读取FPGA ADC数据不随电位器变化,但其他串口工具正常

我通过UART与FPGA进行通信,FPGA的ADC引脚连接了一个电位器,期望将ADC输出数据发送至PC端。在PC端我使用PySerial读取数据,但调节电位器改变ADC输入时,Python读取的数据未发生变化,而在其他串口监控程序中可实时看到更新的数据。以下是我使用的代码:

import serial
ser = serial.Serial(
 port='COM31',
 baudrate=19200,
 parity=serial.PARITY_NONE,
 stopbits=serial.STOPBITS_ONE,
 bytesize=serial.EIGHTBITS)
while True:
 in_bin = ser.read()
 in_hex = hex(int.from_bytes(in_bin,byteorder='little'))
 print(in_hex,end=' ')

解决方案

结合你的场景,问题大概率出在串口缓存、读取逻辑或者数据解析的细节上,给你几个针对性的排查和修复方向:

  • 清空串口缓存再开始读取
    其他串口工具可能已经取走了最新数据,而你的Python程序启动后,可能一直在读取串口驱动缓存里的旧数据。建议在进入循环前先清空输入缓存:

    ser.flushInput()  # 清空输入缓存,确保读取最新数据
    while True:
        # 原读取逻辑
    
  • 确认数据读取的字节长度
    你现在用ser.read()每次只读取1个字节,但ADC数据通常是多字节(比如12位ADC会用2字节传输)。如果FPGA发送的是多字节数据,只读1个字节会拿到不完整的分片,看起来就像数据没变化。可以根据FPGA的发送格式调整读取长度,比如读取2字节:

    in_bin = ser.read(2)  # 读取2字节ADC数据
    

    同时要注意,FPGA的字节序(大端/小端)要和你代码里的byteorder='little'匹配,如果FPGA是大端发送,要改成byteorder='big'。

  • 添加串口超时设置
    没有超时的话,ser.read()会一直阻塞直到读到数据,容易导致数据堆积在缓存里。初始化Serial时加上超时参数,让读取操作在指定时间内返回,避免旧数据残留:

    ser = serial.Serial(
        port='COM31',
        baudrate=19200,
        parity=serial.PARITY_NONE,
        stopbits=serial.STOPBITS_ONE,
        bytesize=serial.EIGHTBITS,
        timeout=0.1  # 设置100ms超时
    )
    
  • 验证数据格式与解析逻辑
    先确认其他串口工具里显示的是二进制数据还是ASCII格式的字符串(比如"123"、"0x0A"这类文本):

    • 如果是ASCII字符串,你的二进制解析逻辑就错了,应该直接读取并解码:
      in_str = ser.readline().decode('ascii').strip()
      print(in_str, end=' ')
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:29:41