저는 현재 Debian을 실행하는 Raspberry PI 4에서 Python 3으로 프로그래밍하고 있습니다. 내 프로그램은 직렬 포트를 사용하여 /dev/ttyS0
MP3 플레이어 보드에 바이너리 요청을 보냅니다. MP3 플레이어 보드 문서에는 재생 상태에 대한 쿼리에 응답한다고 나와 있습니다. MP3 재생이 시작된 후 프로그램이 반복되어 재생이 완료된 시기를 알 수 있습니다.
RPi가 다시 시작된 후 프로그램이 제대로 실행되지만 두 번째 및 후속 실행 시도에서 "장치 연결이 끊어졌거나 포트에 여러 번 액세스했습니다." 오류가 발생합니다. RPi 대신 MP3 플레이어를 다시 시작해도 오류가 계속 발생합니다. 시간 초과를 변경해도 중지되지 않는 것 같습니다.
포트에 액세스하는 항목이나 연결 끊김을 방지하는 방법을 확인하려면 어떤 프로그램이나 유틸리티를 실행할 수 있습니까?
제 생각에는 프로그램 문제라기보다는 운영체제 문제인 것 같은데, 그래서 여기에 질문드립니다.
"""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
이것이 패치인지 수정인지는 확실하지 않지만 직렬 open 문에서 시간 초과 매개변수를 늘리기 시작했는데 이제는 오류가 발생하지 않습니다.
serial.serialutil.SerialException: 읽기 실패: 장치에서 읽을 준비가 되었다고 보고했지만 데이터를 반환하지 않았습니다(장치 연결이 끊어졌거나 포트에 다중 액세스가 있었습니까?)
2부터 시작해서 20까지 가더니 오류보고를 멈췄어요. MP3 보드의 칩이 매우 빠른 직렬 포트를 지원하지 않는 것 같습니다.
이것은 위의 오류를 중지했습니다. 전체 반환 코드를 다시 가져오려면 아직 해야 할 일이 남아 있습니다. 이 시점에서 내가 돌려받는 것은 모두 0이며 문서에 표시된 것과 같은 선행 또는 후행 정보가 없습니다.