"장치 연결이 끊어졌거나 포트에 다중 액세스가 있습니다" 오류

"장치 연결이 끊어졌거나 포트에 다중 액세스가 있습니다" 오류

저는 현재 Debian을 실행하는 Raspberry PI 4에서 Python 3으로 프로그래밍하고 있습니다. 내 프로그램은 직렬 포트를 사용하여 /dev/ttyS0MP3 플레이어 보드에 바이너리 요청을 보냅니다. 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이며 문서에 표시된 것과 같은 선행 또는 후행 정보가 없습니다.

관련 정보