2010-12-16 4 views
7

私はboost :: asioとboost :: asio :: serial_portデバイスに特有の問題があります。このコードは最終的には非同期の読み込みや処理ではうまく動作しますが、シリアルポートの速度を変更する方法はわかりません。boost :: asioでシリアルポートの速度を変更する方法(またはハードウェアバッファが空であるかどうか調べる方法)

今私がしようとしているのは、私のシリアルポートに接続されているデバイスにシリアルポートの速度を38400ボーに変更するよう伝えてから、コンピュータのシリアルポートを同じ速度に設定しています:

port_.set_option(boost::asio::serial_port_base::baud_rate(rate));

しかし、何が本当に起こっていることは、私はSET_OPTIONの一部を行う場合、デバイスは速度を変更するコマンドを受信したことがないということです。 set_optionを実行しないと、デバイスは速度を正しく変更します。私は何が起きているのかは、(ブロッキング、同期)書き込みは、コンピュータのハードウェアバッファにデータを入れて戻ってから、(データをデバイスに送信する前に)バッファを破棄するset_optionを行います。だから私は、ハードウェアのバッファが空で、デバイスが実際にコンピュータのシリアルポートを再設定する前に、速度を変更するコマンドを受け取ったかどうかを確認する方法を考える必要があります。私はまた、速度変更が有効になるためにポート上でclose()とopen()をしなければならないかどうかに関する情報を見つけることができません。 close()がバッファー内のものを破棄するかどうかも疑問に思っています...私はUSB->シリアルポートアダプターを使用しています。私のプラットフォームはUbuntu 10.10です。

答えて

-1

バッファをフラッシュするか、適切な代替フラッシュを探してみましたか?

クライアントとサーバーは同じプロセスですか?

Boost.Asio iostream flush not working?

+0

私は基本的にboost :: asio:io_serviceとboost :: asio :: serial_portを持っています。io_serviceは初期化され、serial_portはコンストラクタのio_serviceで初期化され、次にserial_portはset_optionsで設定されます。 serial_portまたはio_serviceでflush()メソッドを見ることはできません。私はコード内にasio :: iostreamを持っていません。 – Dago

+0

私は、異なる速度で動作する別のデバイスに接続するときに、シリアルポートを閉じています。興味深い問題です。申し訳ありませんが、もっと助けてもらえません。 – Kieveli

+0

-1 OPはAsioストリームを使用していません –

3

man 3 termiosでおlookedをお持ちですか? tcdrainが fdで参照されるオブジェクトに書き込まれたすべての出力 が送信されるまで、あなたは()待機

tcdrainを必要とする何がそうです。

あなたはboost::asio::serial_port::nativemethodからネイティブのディスクリプタを得ることができます。

関連する問題