我正在运行当前 Debian 的 Raspberry PI 4 上使用 Python 3 进行编程。我的程序使用串行端口/dev/ttyS0
向 MP3 播放器板发送二进制请求。有关 MP3 播放器板的文档称它将响应有关播放状态的查询。该程序在 MP3 开始播放后循环,以了解其何时结束播放。
该程序在 RPi 重新启动后运行良好,但在第二次及以后尝试运行时出现“设备已断开连接或端口上的多个访问”错误。如果重新启动 MP3 播放器而不是 RPi,仍然会出现该错误。更改超时似乎并不能阻止它。
我可以运行什么程序或实用程序来查看正在访问端口的内容或如何防止断开连接?
我认为问题是操作系统问题而不是程序问题,但这就是我在这里问的原因。
"""Sends a message via serial & receives back information via serial."""
import serial
import time
PLAYING_DONE = bytearray([0, 0, 0])
def write_command(port, command):
"""Write command to serial port"""
command = [170] + command # Command packet starts with 0xAA
command.append(sum(command) % 256) # Append checksum
print(command)
port.write(bytearray(command))
def read_status(port):
"""Read status? Returns 3L bytearray"""
write_command(port, [1, 0])
bytes = port.read(5)
if bytes[0] != 0xAA:
raise ValueError('Serial sentinel error')
if bytes[4] != (sum(bytes[:-1]) % 256):
raise ValueError('Serial read checksum error')
return bytes[1:-1]
def play_track(port, track_info):
"""Start playing track. Track is??"""
write_command(port, [7] + track_info)
with serial.Serial(
'/dev/ttyS0', #'COM3:',
baudrate=9600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
timeout=2) as ser:
# Start of serial context
play_track(ser, [2, 0, 4]) # Track info?
playing = None
while playing != PLAYING_DONE:
time.sleep(4)
playing = read_status(ser)
print(f'Status = {playing}')
# end of serial context
print("I am done")
答案1
不确定这是否是补丁或修复,但我开始增加串行打开语句中的超时参数,现在,它不会给出错误
serial.serialutil.SerialException:读取失败:设备报告已准备好读取但未返回任何数据(设备已断开连接或端口上有多个访问?)
我从 2 开始一直到 20,然后才停止报错。我想 MP3 板上的芯片不支持非常快的串行端口。
这只是停止了上述错误。我还有工作要做才能取回整个返回代码。此时,我返回的只是零,没有像文档所示的前导或尾随信息。