Linuxシリアルポート "/dev/ttySX"は正常にデータを送信しますが、受信したデータを端末に印刷することはできません。

Linuxシリアルポート

両方のデバイス(1:Red Hat Linux、2:Windows)間のRS-232通信をテストしています。

送受信したデータを確認できます。 Windowsではシリアル通信プログラムで確認でき、Linuxではターミナルで簡単に確認できます。 RS-232通信と同じ基本設定をした後、データの送受信を試してみました。

Linux デバイスから Windows デバイスにデータが転送されると、Windows 通信プログラムから受信されたことを確認できます。逆に、WindowsデバイスからLinuxデバイスにデータを送信すると実行されますが、端末には表示されませんcat /dev/ttySX

RS232データの送受信をテストするために入力したコマンドは次のとおりです。

dmesg | grep ttyS

#output:
ttyS0 at MMIO 0xdf301000 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS1 at MMIO 0xdf301400 (irq = 126, base_baud = 7812500) is XR17V35X
ttyS2 at MMIO 0xdf301800 (irq = 126, base_baud = 7812500) is XR17V35X --> real usage
ttyS3 at MMIO 0xdf301c00 (irq = 126, base_baud = 7812500) is XR17V35X
setserial /dev/ttyS2 uart 8250

# Output
ttyS0 UART:undefined Port:0x0000
ttyS1 UART:undefined Port:0x0000
ttyS2 UART:8250 Port:0x0000 ---> Why port is 0x0000?
ttyS3 UART:undefined Port:0x0000
stty -F /dev/ttyS2 115200 cs8 -cstopb -parenb

2 つの端末を開き、それぞれ次のコマンドを実行します。

ターミナル1:

cat /dev/ttyS2" (or "cat < /dev/ttyS2")

NO2。ターミナル:

echo -e -n \x2\x3\x1\x0\x0\x0\x0\x3 > /dev/ttyS2

端末 2 から送信されたデータは Windows デバイスのシリアル通信プログラムで正しく受信されますが、Windows デバイスから送信されたデータは端末 1 には表示されません。ところでプログラムを言わずにcat /dev/ttyS2ただWindowsシリアルポートで送ったのですが、コマンドをするとcat /dev/ttyS2応答も受けました。

Q:受信したデータを表示するにはどうすればよいですかcat /dev/ttyS2?ポート0x0000とはどういう意味ですか?

読んでくれてありがとう。

ベストアンサー1

受信したデータを表示したい場合はどうすればよいですかcat /dev/ttyS2

使用するツールがお客様の目的に適していない可能性があります。概念的には非常に簡単ですが、cat実装はまったく簡単ではないかもしれません。

catおそらく、ブロックデバイスのファイルで主に動作するように設計されており、入力と出力をバッファリングできます。最初は、利用可能な少量のデータを処理することができ(ブロック指向デバイスからのものと想定される入力ストリームと「同期」するために)、そのデータが処理されてより多くのデータを待たなければならないcatとき、より大きなデータブロックが到着したときまで待ち、すべてのデータが再処理され、効率的なファイルシステムの入出力を提供します。

この問題catGNUが少なくとも128KiBのバッファサイズを使用できることを示します。

他の実装の(非?)バッファリング動作はcat非常に異なる場合があります。

minicom2つの別々の端末と通常のコマンドを使用する代わりに、シリアルポートのみを処理するように設計された単一のユーティリティ(RHEL標準パッケージのコレクションにあります)を使用できます。もっとシンプルでミニマルなものが欲しいなら、EPELリポジトリにpicocomGithub とその説明はここにあります。)。

これらのプログラムはブロック指向の仮定を行わず、端末のPTYデバイスが他のバッファリング層によって受信データ遅延を引き起こさないようにする方法も「知っています」。


ポート0x0000とはどういう意味ですか?

PCアーキテクチャのためのオリジナル8250 UARTの使用ポートマッピングI/O、デフォルトではI / Oポートに別々のアドレス空間を使用し、それを使用するために専用のCPU命令を使用します。これは長い間標準だったので、Linuxツールはsetserialすべての8250準拠のUARTが特定のポートアドレスにあると仮定しました。

しかし、最新のXR17V35X UARTチップは8250と逆互換ですが、以下を使用するように設計されています。メモリマップされたI/OPCIeバスには実際には別々のI / Oアドレス空間がなくなり、最新のシステムではメモリマップされたI / Oがより効率的になります。 I/O アドレス空間にアクセスするためにレガシーおよびinp命令outを使用する代わりに、UART のレジスタは、メモリで使用されるのと同じ正常で高度に最適化された CPU 命令を使用してアクセスを介してアクセスできます。

メッセージがttyS2 at MMIO 0xdf301800 ...ログインすると、dmesgXR17V35X UARTはマッピングされた物理/バスアドレスを示します。メモリマップされたUARTにはポートアドレスがないため、setserialたとえば、Port: n/aポートアドレスの概念が特定のUARTに適用されないことを示すか、または同様のものを表示することがより適切ですMMIO:0xdf301800

おすすめ記事