時にはシリアルデバイスからデータを読み取る必要があるため、minicom
orとjustscreen
の複雑さをスキップしますcat
。ただし、stty <baud>
これはファイルを開こうとする前に最初に端末の転送速度を設定した場合にのみ機能します。
このデータはすでにカーネルにバッファリングされている可能性があります。この場合は、次を使用します。UART-USBブリッジ。 USB転送速度は特定の規格に従って固定されているため、転送速度の設定はデータの解釈にのみ影響します。 USBパケットのデータがどのように見えるか理解できないので、固定された読み取り速度(転送速度)でUSBパケットデータの「解釈」を視覚化する方法がわかりません。
$ stty 115200
$ cat /dev/ttyACM0
ここで何が起こっているのでしょうか?この設定がハードウェアで何を意味するのか理解していますが、ユーザースペースソフトウェア?
ベストアンサー1
すべてがどのように機能するかについて少し混乱する可能性があります。
まず、/dev/ttyACM0
これはUSBリンクまたは接続されたシリアルアダプタのUSBエンドポイントを表しません。シリアル通信を処理するアダプタ内のUARTを表します。ここで読み取るデータにはUSBヘッダーやフレームは含まれません。同様に、ここで読み取るデータには/dev/ttyS0
PCI Expressヘッダーやフレームは含まれません。これらの転送速度を設定すると、接続されたバスではなく対応するハードウェアに影響を与えるため、USB接続には影響しません。
第二に、ボーレートはソフトウェア設定ではなくハードウェア設定です。シリアルポートでこの設定を呼び出すと、ハードstty
ウェアがデータを受信しようとする転送速度を変更するようにカーネルに指示します。これは、特に、この変更前に受信されたすべてのデータが偽(ハードウェアが正しく解釈されていないため、転送速度が互いに近いか正確な高調波の場合に発生する)、または完全に失われたことを意味します(ハードウェアは、最新のハードウェアで発生する可能性があります。これが高いため、これを許可しません。
シリアルラインからデータを読みたい場合は、もう一方の端でデータを転送する前に転送速度を正しく設定する必要があります。これはまた、ボーレートを変更してもカーネルがデータを解釈する方法が変わらないことを意味します。データがすでにカーネルにバッファリングされている場合、転送速度を変更しても変更されません(ただし、将来のデータが良いかどうかを知るために、転送速度を変更した後にカーネルバッファを空にすることをお勧めします)。
したがって、明確に言うと、特別なソフトウェアを使用せずにUSBからシリアルアダプタにデータをインポートする正しい方法は次のとおりです。
- システム起動時のボーレートを設定します。 USBシリアルアダプタの場合、これはデバイスが接続されているときにも設定されるudevルールでなければなりません。
cat
データを読み取るには(またはod
テキストの代わりにバイト値が必要な場合)を使用します。これにより、USBシリアルアダプタから受信した正確なデータが返されます(アダプタが特に処理しないと仮定)。