web-dev-qa-db-ja.com

ユーザースペースから端末のボーレートを設定することの意味は何ですか?

シリアルデバイスから読み取る必要がある場合もあるので、minicomまたはscreenの複雑さをスキップしてcatだけにします。ただし、これは、ファイルを開こうとする前に、最初にstty <baud>を使用して端末のボーレートを設定した場合にのみ機能します。

このデータは、カーネルですでにバッファリングされている(またはバッファリングできる)可能性があり、この場合、 ARTからUSBへのブリッジ を使用して受信されました。 USB転送速度は特定の規格に対して固定されているため、ボー速度の設定はデータの解釈にのみ影響します。このデータがUSBパケットにラップされているように見えるかどうかについての洞察が不足しているため、一定の読み取り速度(ボーレート)でUSBパケットデータの「解釈」を視覚化する方法がわかりません。

$ stty 115200
$ cat /dev/ttyACM0

ここで実際に何が起こっているのですか?この設定がハードウェアに与える影響は理解していますが、userspaceソフトウェアではどういう意味ですか?

3
sherrellbc

これがどのように機能するかについて少し混乱しているようです。

まず、/dev/ttyACM0はUSBリンクを表しておらず、接続しているシリアルアダプターのUSBエンドポイントも表していません。これは、シリアル通信を処理するアダプター内のUARTを表します。データ/dev/ttyS0から読み取ったデータにPCIExpressヘッダーやフレーミングが含まれないのと同様に、そこから読み取るにはUSBヘッダーやフレーミングは含まれません。これらにボーレートを設定すると、バスではなく、それが表すハードウェアに影響します。接続されているので、これはUSB接続には何もしません。

第二に、ボーレートはハードウェア設定であり、ソフトウェア設定ではありません。 sttyを呼び出してシリアルポートに設定すると、カーネルは、データを受信しようとしているボーレートを変更するようにハードウェアに指示します。これは特に、この変更の前に受信したデータが偽物であるか(ハードウェアによって正しく解釈されなかったため、ボーレートが互いに近いか正確な高調波である場合)、完全に失われることを意味します。 (ハードウェアがそれを受け入れなかったため、最近のハードウェアでより可能性が高いケースです)。

シリアル回線からデータを読み取る場合は、データが相手側から送信される前に、ボーレートを正しく設定する必要があります。これは、ボーレートを変更しても、カーネルがデータを解釈する方法は変更されないことも意味します。データがすでにカーネルにバッファリングされている場合は、ボーレートを変更したからといって変更されることはありません(ただし、ボーレートを変更した後、カーネルバッファを空にして、将来のデータが適切であることがわかるようにすることをお勧めします)。

したがって、明確にするために、特別なソフトウェアを使用せずにUSB-シリアルアダプタからデータを取得する正しい方法は次のとおりです。

  1. システム起動時のボーレートを設定します。 USB-シリアルアダプタの場合、これはおそらくudevルールである必要があり、デバイスが接続されたときにも設定されます。
  2. データの読み取りには、cat(またはテキストの代わりにバイト値が必要な場合はod)を使用します。これにより、USB-シリアルアダプタが受信した正確なデータが返されます(アダプタが特別な処理を行わない場合)。
7