2012-04-30 21 views
1

私のプロジェクトでは、多くの(8)シリアルデバイスを読まなければなりません。彼らはパンチルト、カメラ、GPS、コンパスなどです。それらはすべてRS232デバイスですが、コマンドの構造と動作が異なります。例えば、私がポートを開くとGPSはすぐに としてデータを送信し始めます。 PanTiltとCameraは特定のコマンドを送信したときにのみ応答します。私はシリアルポートの読み取りをブロックする

  • OS環境に以下の使用

    :Ubuntuの11.10

  • 言語:C++
  • フレームワーク:PanTilt 4.7

Qtとカメラは、私はこのような機能を開発したいです。

int SendCommand(string& command, string& response) 
{ 
    port.write(command, strlen(command)); 
    while(1) 
    { 
     if(response contains '\n') break; 
     port.read(response) // Blocking Read 
    } 
    return num_of_bytes_read; 
} 

私は、厳密な同期動作を必要とし、このような何かを行うには

SendCoammd("GET PAN ANGLE", &angle); 
    if(angle > 60) 
    SendCommand("STOP PAN", &stopped?); 
    if(stopped? == true) 
     SendCommand("REVERSE PAN DIRECTION", &revesed?); 
     if(reversed? == true) 
      SendCommand("START PAN", &ok); 

...この関数は、このような、より複雑なアルゴリズム のためのビルディングブロックとして使用されるように、この方法を実装したいです。誰にどのようにこれにアプローチするか考えている?

+0

(関連性のないニックピッカーノート: 'string&'を渡すのは良い考えではないでしょう。おそらく 'const string 'または単に' string'が必要です; 'string'の' strlen'も意味をなさないので、その 'size'メソッド) –

答えて

0

標準ファイルAPIの問題点は何ですか? Qtのシリアルポートと

fd = open("/dev/ttyX"); 
write(fd, command.cstr(), command.size()); 
vector v(MAX_SIZE); 
read(fd,&v[0], MAX_SIZE); 
+0

はい、私はそれを行うことができます。私はすでにQtでQextSerialPortを試しましたが、SerilalPort in :: EventDrivenモードを使用しました。だから私はreadyRead()信号を実装する必要があります。これは非同期読み取りです。しかし、私のアプリケーションでは、同期書き込み/読み取りが便利であると思います。何とかQextSerialPortは::ポーリングモードでは動作しません。 – newbee

+0

書き込みと読み取りは同期です – Baget

0

低レベル通信は、部分的QIODeviceインタフェースを実装QExtSerialPortライブラリを用いて確立することができます。

自分で実装する必要がある高度なプロトコル。

+1

QextSerialPortは:: EventDrivenモードで動作しますが、:: Pollingでは動作しませんでした。私はSerialPort in :: Pollingモードを作成する必要があると思います。同期書き込み/読み込みが必要です。あれは正しいですか?どういうわけかポーリングは機能しません。私はすぐにコードを掲載します。ありがとうございました! – newbee

+0

@ user1366507、いくつかのケースでは動作しないかもしれません(私はこのライブラリの比較的古いバージョンを使用していてもイベントをサポートしません)が、イベントからブロッキングモードにいつでも移動できます。 – Lol4t0

1

私はこのチュートリアルが非常にintrestingと有用であることがわかりました。 http://www.webalice.it/fede.tft/serial_port/serial_port.html

これは、boost :: asioを使ってsyncとasyncの両方の読み書きを実行する方法を示しています。

ありがとうございました!

+0

これは答えではなく、あなたの質問に対するコメント(またはあなたが質問を編集できる)であるべきです。 – hlovdal

関連する問題