シリアル転送ボーレートの不一致

シリアル転送ボーレートの不一致

2つのシリアルポートがあり、1つはマザーボード(/ dev / ttyS0)を介して、1つはPCIEからオックスフォードチップ(/ dev / ttyS1)を備えたRS232カード(Startech 2S952)に接続されています(/ dev / ttyS2がありますが、ここにには入りません)。物語))。私の場合、転送速度をどのように解釈しますか?

[    1.111618] 00:03: ttyS0 at I/O 0x3f8 (irq = 4, base_baud = 115200) is a 16550A
[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

ロジックアナライザをシリアルポートのTx / Rxラインに接続しました。私がするとき:

stty -F /dev/ttyS0 115200
echo "ABCDEFGH" > /dev/ttyS0

その後、ロジックアナライザは「ABCDEFGH」文字列と0x0D 0x0Aをデコードできますが、転送速度は115200と言う必要があります。また、USBシリアルアダプタ(ヌルモデムケーブル経由)を使用してノートブックを接続し、シリアルポートを読み取るときに受信機を115200に設定した場合にのみ意味のある出力を得ます。これが私が理解するものです。

今/dev/ttyS1を使用してください:

stty -F /dev/ttyS1 115200
echo "ABCDEFGH" > /dev/ttyS1

論理分析により、私のメッセージがミリ秒単位ではるかに遅いことが明らかになります。実際には約34.7(2)倍遅いです。つまり、40000000/115200 = 34.7(2) です。具体的には、受信ラップトップは複数の0x00を含むメッセージを受け取ります。 3200ボードに設定すると、横説説が表示されます。明らかに、メッセージは実際には115200 / 34.6 = 3339.13 ... bpsで送信されます。

/dev/ttyS1 の場合:

stty -F /dev/ttyS1 4000000
echo "ABCDEFGH" > /dev/ttyS1

/dev/ttyS1 との通信が発生すると、ビット持続時間は予想される 115200 と一致します。

だから私にとってこれは次のことを意味します。

[    1.112543] 0000:08:00.0: ttyS1 at I/O 0xf010 (irq = 40, base_baud = 4000000) is a 16550A

「4000000」は一部の内部発振器の周波数として解釈する必要があり、実際の伝送速度は115200になります。私はこの値がハードウェアの内部にあり、ドライバの内部に隠されていることを望みます。

私は何を見逃していますか?シリアルポートを初めて使用して完全に迷いました。

カーネルパラメータとして "console=ttyS1,4000000n8" を渡すと、ラップトップがシリアル経由で通信するように 115200 を設定できます。

答え1

したがって、推測によると、何らかの理由でこのカードで実行されている基本クロックのカーネルの理解が間違っているようです。シリアルポートは単純なデバイスなので、システムにカードからシリアルポートを見つけるための標準的な方法がなくても驚くことはありません。少なくとも場合によっては、構成部品除数基本クロックに適用され、これを得るには実際の基本クロックに関する知識が必要です。

(カードには最大速度を設定するためのジャンパがあるので、それをサポートするドライバに設定を知らせる方法があるかもしれません。)

とにかくオプションsetserialがあるようですbaud_base。このオプションを使用すると、問題を手動で解決するのに役立ちます。

setserial /dev/ttyS1 baud_base 115200

関連情報