0

USB デバイス用のカーネルスペース ドライバーを作成しました。接続されている場合、たとえば /dev/myusbdev0 にマウントされます。コマンド ラインで echo -en "command" > /dev/myusbdev0 を使用して、デバイスにコマンドを送信し、cat /dev/myusbdev0 で結果を読み取ることができます。

さて、C++ プログラムを書かなければなりません。最初に、次のように読み取り/書き込み用にデバイスファイルを開きます。

int fd = open("/dev/echo", O_RDRW);

その後、デバイスを動作させるためにコマンドが送信されます。

char cmd[] = { "\x02sEN LMDscandata 1\x03" };
write(fd, cmd, sizeof(cmd));

これで、まだ処理方法がわからない部分に到達します。データを継続的に送信し続けるため、デバイスから読み取る必要があります。このデータを今すぐ読み取って解析する必要があります...

char buf[512];
read(fd, buf,  sizeof(buf);

データは次のようになります。それぞれが \x02 で始まり、\x03 で終わります。必ずしも同じサイズではありません。

sRA LMDscandata 1 1 89A27F 0 0 343 347 27477BA9 2747813B 0 0 7 0 0 1388 168 0 1 DIST1 3F800000 00000000 186A0 1388 15 8A1 8A5 8AB 8AC 8A6 8AC 8B6 8C8 8C2 8C9 8CB 8C4 8E4 8E1 8EB 8E0 8F5 908 8FC 907 906 0 0 0 0 0 0 すべての値は 20hex {SPC} で区切られています

\x03 を読み取るまで、\x02 から継続的にデータを読み取るには、ある種の while ループが必要だと思います。完全なスキャンがある場合は、この ascii メッセージを個別の部分 (いくつかの変数 uint_16、uint_8、enum_16 など) で解析する必要があります。

完全なスキャンを buf[] に読み込み、そのコンポーネントを解析する方法はありますか?

4

1 に答える 1

1

デバイスが継続的に送信していると言うように、入ってくるチャンクを保持するキューを追加し、キューの一部、つまり x02 から x03 を取り出して、チャンクの受信から行われる作業を分離するディスパッチをお勧めします。

さらに、おそらくスレッド化された、x02 から x03 までの 1 つの完全なブロックを処理する単一のオブジェクトを持つことができます (与えられた情報で意味があります)。

デバイス => チャンク リーダー => 入力キュー => 入力リーダー => データ処理

お役に立てれば

于 2012-06-09T11:21:49.683 に答える