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
が定義/利用できないため、このようにボーレートを設定するにはどうすればよいですか?
カーネルを変更せずにボーレートを非標準値に設定するにはどうすればよいですか?
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);
Linuxでstty
コマンドを使用して、カスタムボーレートを設定できます。たとえば、シリアルポート/ dev/ttyX0で567890のカスタムボーレートを設定するには、次のコマンドを使用します。
stty -F /dev/ttyX0 567890
dougg3にはこれがほとんどあります(コメントはできません)。知っておく必要のある主な追加事項は、互いに競合することはありませんが、正しいプロトタイプを提供するヘッダーです。答えは
#include <stropts.h>
#include <asm/termios.h>
その後、できればioctl()呼び出しのエラーチェックでdougg3のコードを使用できます。おそらく、通常のtermiosを使用して他のパラメーターを設定する残りのシリアルポートコードの別の.cファイルにこれを配置する必要があります。最初にPOSIX操作を行い、次にカスタム速度を設定することで、Raspberry Piの組み込みUARTで正常に動作し、250kのボーレートを取得します。
Macユーザーの場合(場合によっては Linuxディストリビューション )
stty ospeed 999999
stty ispeed 999999
BOTHER
は<asm/termios.h>
Linuxの場合。そこから定義を引き出すことは非常に移植性が低くなりますが、とにかくこのAPIは移植性がないと想定しているので、おそらく大きな損失はありません。
マザーボードのCPUにシリアルI/Oチップがあります( 16650 UART )。このチップは、制御およびデータバスとして8ビットポートを使用するため、制御およびデータバスを介してこのチップに書き込むことにより、コマンドを発行できます。
通常、アプリケーションはシリアルポートで次の手順を実行しました
要するに、ボーレートはSTTYコマンドでのみ指定でき、他のすべてのオプションはデフォルトのままになり、他のデバイスに接続するのに十分なはずです。