/dev/ttyACM0
2つのPythonスクリプトを使用してRasbperry()のシリアルポートにアクセスしようとしていますが、一方が他方をブロックしているため、明らかに機能しません。問題は、1つのスクリプトはシリアルポートから読み取るだけで、もう1つのスクリプトは書き込みだけでよいということです。書き込みスクリプトは一部のコマンドを送信するために時々実行されますが、読み取りスクリプトは他のデバイスからメッセージを記録する必要があるため(常に受信する必要があるため)、2つのスクリプトを組み合わせることはできません。
書いてみました。第三スクリプトと単一のシリアルポート間の中継として機能するPythonプログラム。シリアルポートを受け入れ、デバイスからのデータを/dev/ttyACM0_read
読み取りスクリプトが読み取る仮想ポート()に書き込みます。書き込みスクリプトは2番目の仮想ポート(/dev/ttyACM0_write
)に書き込み、リレーアはこのポートからデータを読み取り、それをシリアルポートに書き込みます。これ失敗仮想ポート("could not open port, no such file or directory"
)を生成できないとき。仮想シリアルポートの作成に関する検索では有用な結果は得られませんでした。
検索中にこの内容を見つけましたがsocat
(私が知っている限り)、2つのポート間でのみ接続を作成できるため、この場合どのような用途に使用されるのかわかりません。
したがって、誰かがリレーPythonプログラムで使用できるようにダミーポートを作成する方法を教えたり、私が経験している単一のポート2スクリプトジレンマのための別の解決策を提示することができます。
プラットフォーム情報: Linuxarmv6lstretchv9
アップデート:ユースケースを明確にするために私が使用するPythonスクリプトは次のとおりです。
スクリプトの作成- ラズベリーでURL()を呼び出すと、hostname.local/foo
シリアルポートがしばらく開き、命令が送信されます。
import web
import serial
urls = (
'/foo', 'foo',
)
class foo:
def GET(self):
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
ser.write("<311>")
ser.close()
return "Success"
if __name__ == "__main__":
app = web.application(urls, globals())
app.run()
スクリプトを読む- シリアルポートから着信データをキャプチャしてファイルに書き込みます。
import serial
ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)
while 1
#If serial data is available, write it to txt file
ser.close()
仮想ポートを使用する特別な理由はなく、単にこれが最も簡単な解決策だと思いました。
@meuhがコメントで指摘したように、ポートで排他モードをキャンセルすると機能しますが、次の方法でこれを達成することはできませんsetserial
。
pi@pizero:~ $ setserial /dev/ttyACM0 ^session_lockout
Cannot set serial info: Operation not supported
pi@pizero:~ $ sudo setserial /dev/ttyACM0 ^session_lockout
pi@pizero:~ $
その後は何も変わりません。 2番目のPythonスクリプトは、以前と同じようにEBUSY(デバイスまたはリソースを使用しています)を返します。