ttyUSB0でDTRを無効にする


11

PiからArduinoクローンボードに接続しています。問題は、Arduinoが接続時にリセットされないようにするために、DTRラインを無効にする必要があることです。

RPiではDTR、DCD、その他の回線を制御することはできないことを読みました。これはRPiにグローバルに当てはまるのですか、それともシリアル通信に使用されるGPIOピンにのみ当てはまりますか?

USBポートでDTRを無効にすることが可能である場合、それをどのように達成しますか?

回答:


6

USBシリアルコンバーターのプロパティは、ホスティングシステムのハードウェアとは何の関係もありませんが、USBシリアルチップ自体と、ホスティングシステムのソフトウェアスタックとのみ関係があります。

piは、標準のLinux USBシリアルドライバーを使用する必要があります。

したがって、hupclArduinoのサイトなどに記載されている設定をクリアする通常のLinuxの方法で、ポートのオープン/クローズへのDTRのリンクを有効/無効にすることができます。

stty -F /dev/ttyUSB0 -hupcl

または、/ dev / ttyUSB0を実際にUSBシリアルポートに対応するデバイスファイルに置き換えます(たとえば、最初に接続されたUnoは/ dev / ttyACM0になる可能性があります)

PI自体のネイティブシリアルポートに関しても、このDTRの動作は最終的にはソフトウェアの制御下にあります。そうでないと主張する人は、ポートの知識を持っているハードウェアではなくLinuxドライバーだけであるという事実を無視しています。オープンまたはクローズ。実際のポートハードウェアは、それが読み取り、書き込み、または再構成されていることを通知するだけで、シリアルデバイスを開くことと同義ではありません。


これは、ホスティングpiが再起動されない限り機能しますか?
user2395126

6

@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

私は、これは一般的なx86_64版のノートパソコンとラズベリーパイ2のいずれかでのUbuntuで動作することを確認しました
Cerin

termiosたとえば、使用する理由はありますos.system("stty -F /dev/ttyUSB0 -hupcl")か?また、ホストシステムの電源を入れた後、Arduinoに初めて接続したときにリセットされないわけではないことに気づきました。それ以降の接続でリセットされるのを防ぎます。何もないよりはましだ。しかし、DTRが切り替わらないようにする方法を理解できたらいいのにと思います。
Jason C

2
@JasonC Using termiosは、fork / exec(呼び出し)を外部プログラム(stty)に保存します。DTRについてどうすればよいかわからないので、この「機能」を受け入れ、ArduinoとPi上のアプリケーションが同期しているかどうかを検出するためのロジック(書き込み/読み取りによるカスタムハンドシェイク)を追加したと思います。
Lekensteyn 2016年

私の最終的な解決策は、piの起動時にsttyコマンドを追加し、その後、ポートにエコーを送信して最初のリセットを強制し、3秒の遅延でarduinoのリセットを待機することでした。その後、私はそれについてそれ以上考えたり、Pythonスクリプトでそれを心配したりする必要はありません。私はそれをrc.localで行いましたが、どこにでもありました。コストはpi起動時間+3秒です。
Jason C

3

RESETとの間に120オーム(または120オームにするための組み合わせ)の抵抗を追加でき5Vます。これにより、リセットが完全に防止されます。他のソリューションではボードから抵抗またはコンデンサを取り外す必要があるため、これは最も侵襲性が低く、アップロードが複雑になります。プログラミングしている場合は、抵抗を保持しないでください。それを除く。

ここに画像の説明を入力してください

LeonardoボードDTRはトリガーされてもリセットされませんが、Raspberryへの接続が失われ、物理的にリセットする必要がある場合があるため、リモートでリセットする必要があるときに問題が発生します。


3
これが反対票に値するかどうかはわかりません。それはやりがいがあり、ソフトウェアベースではありませんが、いくつかの研究の後、それは実用的なハードウェアソリューションであるように見えます。
Jason C

0

SeriaとpySerialライブラリーを使用する場合は、以下を使用できます。

ser = serial.Serial( '/ dev / ttyACM0'、9600、dsrdtr = True)


-1

PySerialを使用できます。Pythonコードの例を次に示します。

port =serial.Serial(
    "/dev/ttyUSB0",
    baudrate=57600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    dsrdtr = False
    )

その他のオプションについては、Pyserialを確認してください。


1
これはライブラリの問題ではありません。私はすでに4つの異なるライブラリを試しましたが、常に同じ結果です-DTRコマンドは無視されます。
jnovacho 2013

これが別のLinuxで動作するものの正確な記述である場合、piハードウェアは汎用の Linuxソフトウェアのみをホストしており、一意に関与していないため、piでも動作するはずです。
Chris Stratton、

1
これは機能しません。Linuxでは、これによりArduinoがリセットされます。
Cerin、2016

1
私が持っているPiとArduinoのどのバージョンでもこれが機能しないことを確認できます(わかりません、申し訳ありませんが、これらのことは何も知りません。知りたくありません。コードをデバッグするシステムが与えられただけです) on、heh。)また、関連しているかどうかはわかりませんが、stty -F /dev/ttyUSB0 -cdtrdsrレポートしinvalid argument: -cdtrdsrます。
Jason C
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.