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=' ')
- 如果是ASCII字符串,你的二进制解析逻辑就错了,应该直接读取并解码:
内容的提问来源于stack exchange,提问作者Muhammet
相关产品推荐
相关产品推荐

