树莓派3通过UART向Waveshare条码扫描模块发送9位命令失败求助
问题描述
尝试通过UART命令在树莓派3与Waveshare条码扫描模块之间通信,始终收到空响应(b'')。发送的命令为9位长度,打印scanning_command后发现首位被忽略。已参照模块官方文档尝试多个Python脚本,问题仍未解决。
用户使用的脚本
import serial # Define the serial port and baud rate serial_port = '/dev/ttyS0' baud_rate = 9600 # Define the scanning command scanning_command = b'\x7E\x00\x08\x01\x00\x02\x01\xAB\xCD' # Open the serial connection ser = serial.Serial(serial_port, baud_rate) # Send the scanning command ser.write(scanning_command) response = ser.read(7) # Read 7 bytes response print("Response:", response.hex())
排查与解决步骤
1. 启用树莓派硬件UART
树莓派3默认可能禁用硬件UART或被蓝牙占用,需手动开启:
- 执行命令
sudo raspi-config - 进入 Interface Options → Serial Port
- 选择"否"关闭串口控制台,选择"是"启用串口硬件
- 重启树莓派:
sudo reboot
2. 修正串口设备路径
树莓派3的硬件UART对应设备是/dev/ttyAMA0,/dev/ttyS0是性能受限的mini UART,建议修改脚本中的串口路径:
serial_port = '/dev/ttyAMA0'
3. 验证命令发送完整性
在脚本中添加代码,确认命令定义和实际发送字节数:
# 打印命令十六进制格式,检查首位是否丢失 print("Command hex:", scanning_command.hex()) # 获取实际发送的字节数 bytes_sent = ser.write(scanning_command) print(f"Sent {bytes_sent} bytes")
若命令十六进制输出不是7E000801000201ABCD,说明命令定义有误;若发送字节数不为9,说明串口配置存在问题。
4. 调整串口超时与读取策略
默认串口无超时设置,ser.read(7)会一直阻塞等待数据。建议添加超时并读取所有可用响应:
# 打开串口时设置2秒超时 ser = serial.Serial(serial_port, baud_rate, timeout=2) # 发送命令后读取所有可用数据 response = ser.read_all() print("Response:", response.hex())
5. 匹配模块串口参数
显式配置串口参数,确保与模块官方文档一致(通常为8数据位、无校验、1停止位):
ser = serial.Serial( serial_port, baud_rate, bytesize=serial.EIGHTBITS, parity=serial.PARITY_NONE, stopbits=serial.STOPBITS_ONE, timeout=2 )
6. 检查硬件连接
- 确认树莓派TX(GPIO14)接模块RX,树莓派RX(GPIO15)接模块TX,GND共地,避免接反
- 确认模块供电正常(部分Waveshare扫描模块需5V供电,检查供电引脚连接)
- 若模块为5V电平,树莓派为3.3V电平,需添加电平转换模块保护引脚
内容的提问来源于stack exchange,提问作者Adrian Olesniewicz
相关产品推荐
相关产品推荐

