回答:
USBシリアルコンバーターのプロパティは、ホスティングシステムのハードウェアとは何の関係もありませんが、USBシリアルチップ自体と、ホスティングシステムのソフトウェアスタックとのみ関係があります。
piは、標準のLinux USBシリアルドライバーを使用する必要があります。
したがって、hupcl
Arduinoのサイトなどに記載されている設定をクリアする通常のLinuxの方法で、ポートのオープン/クローズへのDTRのリンクを有効/無効にすることができます。
stty -F /dev/ttyUSB0 -hupcl
または、/ dev / ttyUSB0を実際にUSBシリアルポートに対応するデバイスファイルに置き換えます(たとえば、最初に接続されたUnoは/ dev / ttyACM0になる可能性があります)
PI自体のネイティブシリアルポートに関しても、このDTRの動作は最終的にはソフトウェアの制御下にあります。そうでないと主張する人は、ポートの知識を持っているハードウェアではなくLinuxドライバーだけであるという事実を無視しています。オープンまたはクローズ。実際のポートハードウェアは、それが読み取り、書き込み、または再構成されていることを通知するだけで、シリアルデバイスを開くことと同義ではありません。
@ChrisStrattonsの投稿stty -F /dev/ttyUSB0
では、リセットにつながるハングアップを回避するための使用方法について説明しています。Pythonで実行するスニペットを次に示します。
import termios
path = '/dev/ttyACM0'
# Disable reset after hangup
with open(path) as f:
attrs = termios.tcgetattr(f)
attrs[2] = attrs[2] & ~termios.HUPCL
termios.tcsetattr(f, termios.TCSAFLUSH, attrs)
ser = serial.Serial(path, 9600)
# etc.
USBケーブルを再接続するときに正確な数になる可能性があるため、グロビングによってパスを検出します。
try:
path = glob.glob('/dev/ttyACM*')[0]
except IndexError:
# retry, error out, etc.
pass
termios
たとえば、使用する理由はありますos.system("stty -F /dev/ttyUSB0 -hupcl")
か?また、ホストシステムの電源を入れた後、Arduinoに初めて接続したときにリセットされないわけではないことに気づきました。それ以降の接続でリセットされるのを防ぎます。何もないよりはましだ。しかし、DTRが切り替わらないようにする方法を理解できたらいいのにと思います。
termios
は、fork / exec(呼び出し)を外部プログラム(stty
)に保存します。DTRについてどうすればよいかわからないので、この「機能」を受け入れ、ArduinoとPi上のアプリケーションが同期しているかどうかを検出するためのロジック(書き込み/読み取りによるカスタムハンドシェイク)を追加したと思います。
RESET
との間に120オーム(または120オームにするための組み合わせ)の抵抗を追加でき5V
ます。これにより、リセットが完全に防止されます。他のソリューションではボードから抵抗またはコンデンサを取り外す必要があるため、これは最も侵襲性が低く、アップロードが複雑になります。プログラミングしている場合は、抵抗を保持しないでください。それを除く。
LeonardoボードDTR
はトリガーされてもリセットされませんが、Raspberryへの接続が失われ、物理的にリセットする必要がある場合があるため、リモートでリセットする必要があるときに問題が発生します。
PySerialを使用できます。Pythonコードの例を次に示します。
port =serial.Serial(
"/dev/ttyUSB0",
baudrate=57600,
parity=serial.PARITY_NONE,
stopbits=serial.STOPBITS_ONE,
bytesize=serial.EIGHTBITS,
dsrdtr = False
)
stty -F /dev/ttyUSB0 -cdtrdsr
レポートしinvalid argument: -cdtrdsr
ます。