39

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

この投稿の「ボーレートエイリアシング」方法を試しましたが、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_flagstruct termiosは と OR する必要があると言っていBOTHER (=CBAUDEX | B0)ます。

この方法では、ボー レートは のc_ispeedおよびc_ospeedメンバに直接設定されstruct termiosます。ただし、C プログラムでこのメソッドを使用する方法がわかりません。著者が言ったようBOTHERに、 を含めると定義済み/利用可能はありませtermios.hん。このようにボーレートを設定するにはどうすればよいですか?

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

4

7 に答える 7

28

BOTHER が定義されていないことについても同じことに気付きました。ジェイミー・シャープが言ったように、あなたはそれを見つけることができます<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);
于 2013-11-15T02:32:40.257 に答える
20

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

stty -F /dev/ttyX0 567890
于 2012-12-11T11:33:31.213 に答える
6

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

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

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

于 2014-02-22T20:49:50.933 に答える
1

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

于 2012-11-05T06:39:12.403 に答える
0

Mac ユーザーの場合 (一部のLinux ディストリビューションの場合もある可能性があります)

stty ospeed 999999

stty ispeed 999999
于 2013-11-19T21:58:18.593 に答える
-2

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

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

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

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

于 2012-12-14T06:56:56.767 に答える