シリアルポートは、NULL値を送信しません。
-
20-09-2019 - |
質問
私は、私は、Linux(Ubuntuの9.10)を使用しています、のXBee無線機で遊んだとのXBeeは自分のコードを使用している場合、シリアルポートを介してNULL値を送信するためには表示されません。私はXCTUプログラム(別々のウィンドウボックス上のXBeeが付属して株式用語エミュレータ)を使用すると、新しいのXBeeがネットワークに参加するとき、私はシリアルポートを介してこの出力を参照してください。
7E 00 20 95 00 13 A2 00 40 3B
など...完璧。しかし、新しいのXBeeは、私はこれを見たネットワークに参加したとき、私のコードを使用します:
7E 20 95 13 A2 40 3B
ここでは、私はシリアルポートを開いています方法です。
struct termios options;
int port;
port = open("/dev/ttyUSB0", O_RDWR | O_NONBLOCK);
tcgetattr(port, &options);
bzero(&options, sizeof(options));
options.c_cflag = B9600 | ~CRTSCTS | CS8 | CLOCAL | CREAD;
tcsetattr(port, TCSANOW, &options);
私は、そのコードが何をするかについての私の理論を持っていますが、私の理論が明らかに間違っています。私は9600、8N1、フロー制御なしでポートをオープンしようとしています。あなたは私もなシリアル> USBドライバを使用しています見ることができますが、私は、データを得るように見えるんので、私は一部が機能していることをかなり確信しています。
私はオプションをBZEROとき私の推測では、私は制御文字0x00を作ってるんですか?よく分かりません。私はオプションをBZEROないとき、私は一度に5つのバイトを読み取ることができると私は、データを失います。私は、フロー制御やボーレートの問題を抱えているので、私は(BZERO)と、今私はNULLを取得しないようにそれは感じています。
私もちょうど私のLinuxシステム上でMinicomのを使用して出力をキャプチャしました。私は、同じ情報なしNULLを(これは本当にプロトコルに慣れていない人のためのパケットサイズを台無し)を取得します。私のコードは、minicomのが変更されていない状態にシリアルポートを設定しませんでしたか?私は失われています。
助けてくれてありがとう!
解決
c_cflags
の初期化は、あなたが基本的に設定し、ビット単位の否定CRTSCTS
の横にのすべてののビットを使用することにより、間違ったに見えます
options.c_cflag = ... | ~CRTSCTS | ...;
そのフラグがセットされてはならない場合は、あなただけのCRTSCTS
を除外すべきである。
他のヒント
のDigiは、と通信するためのANSI Cコードの xbee_ansic_library に、オープンソース(MPL 2.0)ライブラリをリリースしました。 APIモードでのXBeeモジュール。これは、POSIX(Linuxでは、BSD、Mac OS Xの、Cygwinの)、Windowsの(MinGWの/ MSYS)、DOS(OpenWatcom)といくつかの組み込みプラットフォームをサポートしています。
あなたはまだUbuntuの中にCのコードを書いている場合、それは興味があるかもしれません。