1

プロジェクトで多くの (8) シリアル デバイスを読み取る必要があります。これらは、Pantilt、Camera、GPS、Compass などです。これらはすべて RS232 デバイスですが、コマンド構造と動作が異なります。たとえば、ポートを開くとすぐに GPS がデータの送信を開始します。PanTilt と Camera は、特定のコマンドを送信した場合にのみ応答します。

以下の環境を使用しています

  • OS: Ubuntu 11.10
  • 言語: C++
  • フレームワーク: Qt 4.7

PanTilt と Camera については、このような機能を開発したいと考えています。

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);

このようなことを行うには、厳密な同期動作が必要です。誰もこれにアプローチする方法を知っていますか?

4

3 に答える 3

1

このチュートリアルは非常に興味深く、役に立ちました。 http://www.webalice.it/fede.tft/serial_port/serial_port.html

これは、boost::asio を使用して同期と非同期の読み取り/書き込みの両方を実行する方法を示しています。

お手伝いありがとう!

于 2012-05-02T19:07:24.533 に答える
0

Qt のシリアル ポートとの低レベル通信は、インターフェイスQExtSerialPortを部分的に実装するライブラリを使用して確立できQIODeviceます。

自分で実装する必要がある高レベルのプロトコル。

于 2012-04-30T19:55:15.573 に答える
0

標準ファイル API を使用する際の問題は何ですか?

fd = open("/dev/ttyX");
write(fd, command.cstr(), command.size());
vector v(MAX_SIZE);
read(fd,&v[0], MAX_SIZE);
于 2012-04-30T19:45:12.477 に答える