私は現在、Debianを実行しているRaspberry PI 4からPython 3にプログラムしています。私のプログラムはシリアルポートを使用して/dev/ttyS0
MP3プレーヤーボードにバイナリ要求を送信します。 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ボードのチップは非常に高速なシリアルポートをサポートしていないようです。
これは上記のエラーを停止しました。完全な戻りコードを再インポートするには、まだやるべきことが残っています。この時点で私が返すものはすべてゼロであり、文書に示されているような先行情報または後続情報はありません。