「デバイスが切断されたか、ポートに複数のアクセスがあります」エラー

「デバイスが切断されたか、ポートに複数のアクセスがあります」エラー

私は現在、Debianを実行しているRaspberry PI 4からPython 3にプログラムしています。私のプログラムはシリアルポートを使用して/dev/ttyS0MP3プレーヤーボードにバイナリ要求を送信します。 MP3プレーヤーボードのドキュメントは、再生状態に関するクエリに応答することを示しています。 MP3の再生が開始された後、プログラムが繰り返され、再生が完了した時期がわかります。

RPi の再起動後、プログラムは正常に実行されますが、2 回目以降の実行で「デバイスの接続が切断されたか、ポートに複数回アクセスしました」エラーが発生します。 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ボードのチップは非常に高速なシリアルポートをサポートしていないようです。

これは上記のエラーを停止しました。完全な戻りコードを再インポートするには、まだやるべきことが残っています。この時点で私が返すものはすべてゼロであり、文書に示されているような先行情報または後続情報はありません。

おすすめ記事