5

組み込みデバイスと通信する唯一の方法は、シリアル ポートです。デフォルトでは、組み込み Linux はこのポートを端末として使用します。この端末を無効にして、シリアル リンクを使用してバイナリ データを転送するにはどうすればよいですか? rx や tx などのコマンドを聞いたことがありますが、見つかりません。

/dev/tty から read() して /dev/tty に write() するだけでよいと思いますが、エラーメッセージやデータストリームの混乱がないことを確認したいと思います。

4

6 に答える 6

3

Linux コンソールを無効にするには、ブートローダーによって作成された Linux コマンド ラインを次のように変更する必要があります: console=/dev/ttyS? to : console=null

于 2009-02-03T13:26:16.693 に答える
3

端末をrawに設定することはできませんか?

このチュートリアルをご覧ください。

于 2009-02-03T12:08:08.410 に答える
3

xmodem などのアプリケーションを使用して、任意の端末でファイルを転送できます。端末から話しかけるシリアルポートですか、それともカーネルコンソールですか。

カーネルのノイズが少ない場合は、現在の接続を使用して xmodem のような転送を行うことができます。ホスト側では、kermit を使用できます。これは素晴らしく、スクリプト可能です。

シリアルポートを raw にしたい場合で、ファイル記述子 ttyfd を開いている場合は、次の方法があります。

struct termios tty, orig_tty;

...

if(tcgetattr(ttyfd, &tty) < 0)
{
    // error checking
}
// backup tty, make it raw and apply changes
orig_tty = tty;
cfmakeraw(&tty);
if(tcsetattr(ttyfd, TCSAFLUSH, &tty) < 0)
{
    // error checking
}

...
//end of program or error path :
tcsetattr(ttyfd, TCSAFLUSH, &orig_tty)

それでも正常に動作する端末が必要な場合は、プログラムの最後に設定を復元することを忘れないでください。

于 2009-02-03T14:18:05.573 に答える
2

他の注意事項が示唆しているように、ここに集められたいくつかの確認事項があります。

  1. Linux カーネルがシリアル ポートを使用していないことを確認します。grub ファイルの bootload コマンドに console= オプションがないことを確認してください。通常、デフォルトでは存在しません。
  2. シリアルポートで getty が実行されていないことを確認してください。/etc/inittab で /dev/ttyS0 (シリアル ポート A) のエントリを探し、そこにある場合はコメントアウトします。
  3. /dev/ttyS0 がプロセスによって読み取りおよび書き込み可能であることを確認してください。制御プログラムを実行する特定のユーザーを作成し、そのユーザーが /dev/ttyS0 を所有し、次に chmod 700 /dev/ttyS0 を所有する場合があります。これにより、他のユーザー/プログラムがシリアル ポートを使用しないようにすることができます。
  4. ttyS0 で open() を使用して fd を取得し、tcsetattr ファミリーのルーチンを使用して回線速度と規則を設定します。

端末プログラムは、組み込みデバイスで同じプログラムを実行して接続の反対側を管理できない限り、おそらく役に立ちません。

于 2009-02-09T04:34:49.133 に答える
2

アプリケーションレベルのプロトコルを介してデータを転送するコマンドを端末で実行できます。XMODEM ファイル転送プロトコルを実装するために参照する rx および tx コマンド。転送するバイナリ データがファイルで構成されていて、スループットの要求が低く、コマンドを実行することによる管理上のオーバーヘッドが気にならない場合は、これが解決策になる可能性があります。または、データ転送と端末の両方を処理するためにシリアル ポートを多重化することもできます。シリアル ターミナル ドライバ コマンド (getty) を無効にし、シリアル ライン上でPPPプロトコルを実行して、デバイスへの IP 接続を確立します。その後、ssh または telnet を介してデバイスにログインし、IP ソケットを介してデータを転送できます。

于 2009-02-03T12:14:46.727 に答える
1

はい、すべてのシリアル ポートが にあります/dev/ttyxx/dev/tty特定のシリアルポートではなく、現在の端末を表すショートカットであることに注意してください。adm多くの場合、これらはルートによって所有されており、アプリケーションからデバイスに直接アクセスするには、特権を持っているか、グループに属している必要があります。

chownデバイスにアクセスできるようにする必要がある場合があります。デバイスの所有権を変更した結果がどうなるかはわかりません。IIRC、それは簡単で、うまく機能します。別の方法は、 を使用setuidしてプログラムを特権状態に昇格させることです。

gettyユーザーがシリアルポートからログインできるという名前のプログラムがあります。ユーザーがログインできるように、シリアル ポートでinittab起動します。getty

を無効にしたいgetty。場合によっては、これを行うのに役立つポート マネージャーがあります。

場合によっては、inittabを使用するように変更できますmgetty。これは、 のよりスマートで制御しやすいバージョンですgetty

于 2009-02-03T12:29:05.403 に答える