技術情報 » JPEGカメラ関連 » C1098のバグについて

C1098のバグについて

 C1098-SSからJPEG画像を取り出す際には、パケット単位でデータを受け取ります。この際のパケットのサイズはSet Packe Sizeコマンドで行いますが、この際に指定するサイズは4の倍数である必要があります。これはC1098-SS内部のコントローラが32bitマシンなので4バイト単位でRAMにアクセスするためです。この制限はマニュアルには記載されていないので注意が必要です。
 また例えばパケットサイズを512バイトに設定した際に、通常のパケットの構造は、パケット連続番号(2バイト)+データ長(2バイト)+データ(506バイト)+チェックサム(2バイト)となります。つまりパケットサイズから連続番号、データ長、チェックサムの合計6バイトを差し引いた506バイトずつのデータが送られてきます。
 しかし最後に送られてくるパケットだけは違います。JPEG画像のサイズはまちまちですので最後のパケットだけはデータ長が様々に変化します。ここで問題になるのは、偶然にこのデータサイズが256の倍数になった際に(256,512,768,1024など)、C1098-SSは本来のデータを送信した後に更に256バイトの意味の無いデータを送信するバグがあります。
 これはカメラ内部でデータを転送する際のループの処理に問題があり、256バイト単位でデータを処理していて、本来は0になったら処理を終了する必要があるのに、0を256と解釈して余計に256バイトのデータを送ってしまうという処理をしてしまっているためです。残念ながらこのバグは半導体内のROMに焼きこまれている処理なので修正ができません。そこでコントロールソフト側で対応する必要があります。

・パケットサイズを256以下に設定する

 パケットサイズを256にすれば、データの長さは必然的に6バイトの付加情報を差し引いた250バイト以下にしかなりませんので、上記のバグに遭遇する事はありません。サイレントで提供しているC#のサンプルソースではパケットサイズを256に設定していますので、このソースを参考にドライバを作成している方は、このバグを心配する必要はありません。

・余計なデータを捨てる処理を加える

 パケットサイズを264以上に設定する場合には、パケットを受け取ったら先頭の付加情報からデータのサイズを把握して、もしそのサイズが256や512であれば、もう256バイト分だけデータを空読みして下さい。得られたデータ長と0xffをAND演算して0になった場合にこの処理をする事になります。

・JPEGデータを取り出す前に必ずSnapShotで画像を撮影する

 一度SnapShotで撮影した画像はC1098-SS内部に保存されます。この画像データを取得した後に改めてもう一度画像データを取得すると本来のJPEGデータの後ろに無意味なデータが連結されて送られるというバグがあります。恐らく上記の256バイトの倍数のバグに関連したものだと思われます。このバグを回避するにはまずSnapShotコマンドで画像を撮影した後に一度だけ画像データを取得して再利用して下さい。

 こうした各種のバグを回避すればC1098-SSは大変安定した動作をしますので、上手にC1098-SSを活用してください。