web-dev-qa-db-ja.com

Linuxでカスタムボーレートを設定する方法は?

Linuxのシリアルポートを介して、_termios.h_で定義されていない非標準ボーレートのデバイスと通信したい。

this post から「ボーレートエイリアシング」メソッドを試しましたが、Cプログラム(「testprogram」と名付けました)を実行すると、Linuxは_"testprogram sets custom speed on ttyS0. This is deprecated."_と言います。

私はGoogleでいくつか検索しましたが、ボーレートを非標準値に変更する別の(新しい?)方法があるようです:On http://sourceware.org/ml/libc-help /2009-06/msg00016.html 著者は、_c_flag_の_struct termios_はBOTHER (=CBAUDEX | B0)とORする必要があると言っています。この方法では、ボーレートは_c_ispeed_の_c_ospeed_および_struct termios_-メンバーに直接設定されます。ただし、Cプログラムでこの方法をどのように使用するかはわかりません。著者が言ったように、_termios.h_を含めるとBOTHERが定義/利用できないため、このようにボーレートを設定するにはどうすればよいですか?

カーネルを変更せずにボーレートを非標準値に設定するにはどうすればよいですか?

34
Felix

BOTHERが定義されていないことについても同じことがわかりました。 Jamey Sharpが言ったように、<asm/termios.h>で見つけることができます。ただの警告として、私はそれと通常の<termios.h>ファイルの両方を同時に含む問題に遭遇したと思います。

それとは別に、私が持っているglibcでは、glibcのtcsetattrが速度設定に注意を払わない古い形式のstruct termiosのioctlを実行していたため、まだ動作しませんでした。新しいスタイルのtermios2構造体を使用してioctlを手動で実行することで、カスタム速度を設定することができました。これは、<asm/termios.h>を含めることでも使用できます

struct termios2 tio;

ioctl(fd, TCGETS2, &tio);
tio.c_cflag &= ~CBAUD;
tio.c_cflag |= BOTHER;
tio.c_ispeed = 12345;
tio.c_ospeed = 12345;
ioctl(fd, TCSETS2, &tio);
22
dougg3

Linuxでsttyコマンドを使用して、カスタムボーレートを設定できます。たとえば、シリアルポート/ dev/ttyX0で567890のカスタムボーレートを設定するには、次のコマンドを使用します。

stty -F /dev/ttyX0 567890
17
manav m-n

dougg3にはこれがほとんどあります(コメントはできません)。知っておく必要のある主な追加事項は、互いに競合することはありませんが、正しいプロトタイプを提供するヘッダーです。答えは

#include <stropts.h>
#include <asm/termios.h>

その後、できればioctl()呼び出しのエラーチェックでdougg3のコードを使用できます。おそらく、通常のtermiosを使用して他のパラメーターを設定する残りのシリアルポートコードの別の.cファイルにこれを配置する必要があります。最初にPOSIX操作を行い、次にカスタム速度を設定することで、Raspberry Piの組み込みUARTで正常に動作し、250kのボーレートを取得します。

3

Macユーザーの場合(場合によっては Linuxディストリビューション

stty ospeed 999999

stty ispeed 999999
0
varatis

BOTHER<asm/termios.h> Linuxの場合。そこから定義を引き出すことは非常に移植性が低くなりますが、とにかくこのAPIは移植性がないと想定しているので、おそらく大きな損失はありません。

0
Jamey Sharp

マザーボードのCPUにシリアルI/Oチップがあります( 16650 UART )。このチップは、制御およびデータバスとして8ビットポートを使用するため、制御およびデータバスを介してこのチップに書き込むことにより、コマンドを発行できます。

通常、アプリケーションはシリアルポートで次の手順を実行しました

  1. プログラム開始時にボーレート、パリティ、エンコード、フロー制御、開始/終了シーケンス長を設定します。このセットアップは、ioctlを介してシリアルデバイスまたは「stty」コマンドで実行できます。実際、sttyコマンドはそのシリアルデバイスに対してioctlを使用します。
  2. シリアルデバイスにデータの文字を書き込むと、ドライバーは8ビットデータバスを介してUARTチップにデータ文字を書き込みます。

要するに、ボーレートはSTTYコマンドでのみ指定でき、他のすべてのオプションはデフォルトのままになり、他のデバイスに接続するのに十分なはずです。

0
Houcheng