●QV-10の通信プロトコル             1998.07.20 ken-ichi HAYASHI

以下に書かれている情報は林が独自に調査したものと、Brahmaさん、
Gotoさん、marioさんらが発見した情報をまとめたものです。
(各人勝手に解析を進めていますので、各人のwebページを覗くと
 ここに書かれていない新たなコマンドが発見されているかもしれません。)
この情報に関してCASIOさんに問い合わせ等を行なうことは
「絶対に」しないでください。

以下に書かれている情報は大嘘かも知れません。
この情報にしたがったせいでQV-10やその中の画像が破壊されたり、
精神的、物質的損害を被ったとしても林および情報を提供して
下さった方々は一切責任をとりません。

以下に書かれている情報は予告なく修正されます。

---------------------------------------------------
QV-10とホストコンピュータとは専用の接続ケーブルで
接続しますが、これをRS-232Cコネクタ側(ホストコンピュータ側)
から眺めた場合、以下のようなプロトコルで通信しているようです。

9600baud 8 bit stop bit 1 Non parity
フロー制御 一切なし

RTSがOFFでないとQV10からのデータは流れて来ません
CTSは常にONになってるみたいですが、関係ないでしょう
(RTSについてはqvplayのREADMEも参照してください。)

DTRも常にONのようです。

QV-10をパワーオンした直後の通信速度は9600baudですが、
後述の"CB"コマンドにより通信速度を変更します。
変更された通信速度はパワーオンしなおされるか、
"CB"コマンドで再変更されるまで有効です。
(QV-700/770系は"cb"らしいが、"CB"も受け付ける)

基本的にQV-10を操作するためにQV-10へ送るコマンドは
以下のようなものです。

0x05 0xXX 0xXX ... 0x06
の05で始まって数バイトのコマンドを送って0x06で閉じる
という形式、最後の0x06でコマンド待機モードへ復帰。
#実際は最初の0x05は必要ないと思います。

●コマンド一覧
  QVへ送るデータ
  ---------------------------------------
  QVの応答データ

  2桁の数値は16進表記、'QR'のように'でくくってあるのは
 その文字のアスキー値を送るという意味です。'QR'なら0x51 0x52
 の2バイトを送っているということです。
 また、QV10から戻ってくるデータのうち、チェックサムと
 思われる1バイトのデータがあります。このチェックサムの
 値は送ったコマンドとパラメータのバイト列を加算して1の
 補数をとったものになります。

・リセット
  05  'QR' 06
  ------------     QV10をリセット状態にします。
    06   5c        このコマンドはいかなる状態でもうけつける
                   ようです
                   QV10からの返事5cはチェックサムです。
                   ~('Q(51)' +  'R(52)') = 5c

・リセットその2
  05  'QE' 06
  ------------     QV10をリセット状態にしますが、
    06   69        QV10の画面をクリアしません。
                   QV10からの返事69はチェックサムです。

・何枚の画像をもっているか?
  05  'MP' 06
  --------------   QV10に何枚の画像が記録されているかを問い合わせ
    06   62  XX    ます。
                   XXに枚数が返ります。
                   QV10からの返事62はチェックサムです。

・QV10のLCDの画面を切替える
  05  'DA' XX  06
  ---------------- QV10のLCDに表示する画面をXX番目の画像に
    06       YY    切替えます。
                   QV10からの返事YY(チェックサム)は
                   (7a - XX)になります。

・メイン画像をJPEG形式でを取り出す
  05  'DA' XX  06 05  'DL'  06  05  'MG'  06 12            06          
  -----------------------------------------------------------------------
    06       YY     06    6f      06    6b     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク?

  XXは画像番号を指定します。
  QV10からの返事6fはチェックサムです。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6bはチェックサムです。
  QV100のFine画像を取り出す場合は、'MG'の代わりに'Mg'を使います。

  画像データの詳細
  02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
        
  WW WW: データサイズ(2バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80)以下
  JJ: データサイズ分の画像データ(cam形式のJPEGもどき部分)
      詳しくは岩間さんの解析資料を参照してください。
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の1の補数

・JPEG形式の画像をQV-10へ書きこむ
  05  'MH'   06   [画像データ]  [画像データ]
  ---------------------------------------------------------
    06    6a    12            06            06

    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

  05  'DJ'   06 
  --------------
    06    ZZ    

  QV10からの返事6aはチェックサムです。
  QV10からの返事ZZ(06?)はよくわかりません。

  画像データの詳細は前出のJPEG形式の画像取り出しで
  説明しているものと同じです。
  ここで説明しているのはNormal画像(480x240)の場合です。
  QV100のFine画像(640x480)の書き込み方法は不明です。

・thumbnail画像をYCC形式で取り出す
  05  'DA' XX  06 05  'DL'  06  05  'MK'  06 12            06          
  ---------------------------------------------------------------------
    06       YY     06    6f      06    67     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク?

  XXは画像番号を指定します。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6fはチェックサムです。
  QV10からの返事67はチェックサムです。

  画像データの詳細
  02 WW WW TT TT TT TT TT ........ 17 SS
        
  WW WW:  データサイズ(2バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80)以下
  TT: データサイズ分の画像データ(thumbnail部分)
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の1の補数

  *thumbnail部分は52×36×3=5616バイトありますが、
    これで得られるデータはその半分の2808バイトしかありません。
  *2808バイトのうち
    先頭から1872バイトは52×36ドット分の輝度(Y)情報(0〜255)、
        次の468バイトが26×18ドット分のCb情報(-128〜127)
    その次の468バイトが26×18ドット分のCr情報(-128〜127)
    です。
    Yはunsigned char、Cb、Crは符合つきcharで表現されているようです。
    RGBへの変換はppm.cを参照してください。YとCCの深みは適当に
    つけています。そのため、cam形式から抽出されるデータと完全に
    は一致しません。

・メイン画像をYCC形式でを取り出す
  05  'DA' XX  06 05  'DL'  06  05  'ML'  06 12            06          
  ---------------------------------------------------------------------
    06       YY     06    6f      06    66     [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク?

  XXは画像番号を指定します。
  QV10からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV10からの返事6fはチェックサムです。
  QV10からの返事66はチェックサムです。
  QV100のFine画像を取り出す場合は、'ML'の代わりに'Ml'を使います。  

  画像データの詳細
  02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
        
  WW WW: データサイズ(2バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80)以下
  JJ: データサイズ分の画像データ(メイン画像)
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の1の補数

  *データ形式はthumbnail画像のYCC形式とほとんど同じですが、
    Normal画像(480x240)の場合、
    総データサイズ153600バイトのうち、
    先頭から115200バイトは480×240ドット分の輝度(Y)情報(0〜255)、
        次の19200バイトが160×120ドット分のCb情報(-128〜127)
    その次の19200バイトが160×120ドット分のCr情報(-128〜127)
    です。
    Fine画像(640x480)の場合、
    総データサイズ460800バイトのうち、
    先頭から307200バイトは640×480ドット分の輝度(Y)情報(0〜255)、
        次の76800バイトが320×240ドット分のCb情報(-128〜127)
    その次の76800バイトが320×240ドット分のCr情報(-128〜127)
    です。
    Yはunsigned char、Cb、Crは符合つきcharで表現されているようです。
    RGBへの変換はppm.cを参照してください。YとCCの深みは適当に
    つけています。そのため、jpeg形式で表現されるデータとは完全に
    は一致しません。

・YCC形式のメイン画像をQV-10へ書きこむ
  05  'MM'   06   [画像データ]  [画像データ]
  ---------------------------------------------------------
    06    65    12            06            06
                  
    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

  05  'DN'   06   05  'DJ'   06 
  -----------------------------
    06    6d        06    ZZ    

  QV10からの返事65はチェックサムです。
  QV10からの返事6dはチェックサムです。
  QV10からの返事ZZ(71?)はよくわかりません。

  [画像データ]のデータ形式はYCC形式のメイン画像の読み込みで
  説明しているものとおなじです。
  ここで説明しているのはNormal画像(480x240)の場合です。
  QV100のFine画像(640x480)の書き込み方法は不明です。

・QV-10に記録されている画像を削除する
  05  'DF' XX  ff  06 
  -------------------   XXは画像番号を指定します。
    06           YY     QV10からの返事YY(チェックサム)は(0x76 - XX)
                        になります。

・撮影する
  05  'DR'  06 
  -----------------     撮影します。
    06    69   ZZ       QV10からの返事69はチェックサムです。
                        QV10からの返事ZZはファンクションSWがPLAYの
                        ときは15、RECのときは06になります。
                        (QV-700/770では使えません。
                         そもそもファンクションSWがRECのときは
                         いっさい通信コマンドをうけつけません)

・QV-10の通信速度を変える
  05  'CB' XX  06
  ----------------      QV10の通信速度を変更します。
    06       YY         XXはQV10内部のSerialControlerに与える
                        パラメータのようです。
                        XXの値と通信速度の関係は以下のとおりです。
                                XX  :   baud
                           46(0x2e) :   9600
                           22(0x16) :  19200

                           11(0x0b) :  38400
                            7(0x07) :  57600
                            3(0x03) : 115200
                        (115200以上は試していません。(^^;)
                        QV10からの返事YYはチェックサムです。


・QV-10に記録されている画像の順番を入れ換える
  (この機能はメモリの書き換えを伴い、かつテストが不十分です。)

  05  'DI' XX  06  05  'DY' 02 XX  06  05  'DF' XX ff  06  05  'Dj' VV  06
  ------------------------------------------------------------------------
    06       YY      06          ZZ      06          WW      06       UU

                                  XX:移動する元の画像の画像番号
                                  YY:チェックサム(0x72 - XX) だと思います
                                  ZZ:たぶんチェックサムだと思います。
                                  WW:チェックサム(0x76 - XX) だと思います
                                  VV:移動する先の画像の画像番号
                                  UU:チェックサム(0x51 - XX) だと思います
   (↑冗長な部分があるような気がします。)

   結果としてはXX番目の画像を削除した後に、頭から数えて
   VV番目に画像を挿入したような動作になります。

   例:XX = 5 VV =2
       移動前 1 2 3 4 5 6 ...
       移動後 1 5 2 3 4 6 ...

・QV-10の電源をOFFする
  05  'QX'  06
  ----------------      QV10の電源をOFFします。
    06    56            QV10からの返事56はチェックサムです。

・オートパワーオフ機能を解除する。
  05  'DU'  06 05  'QE'   06
  -------------------------- QV10のオートパワーオフ機能を解除します。
    06    66     06    69    QV10からの返事66、69はチェックサムです。

・QV-10の電源状態をレポートする
  05  'RB'  05  FF  FE  E6  06
  -------------------------------  QV10の電源状態を問い合わせます。
    06                    83  XX   XXに状態が返ります。
                                   QV10からの返事83はチェックサムです。
             XXを16(0x10)で割った値がだいたい電圧になります。
             新品のアルカリ電池(6.0V)では0x51という値になりました。
             値が3b以下になるとリンクソフトでは警告を出してQV-10の
             電源をOFFするようです。
             (QV-700/770では上記の値にならないようです。)

・QV-10のLCDにカラーパターンを表示する。
  05  'DP'  06
  ----------------      QV10のLCDにカラーパターンを表示します。
    06    XX            QV10からの返事XXはチェックサムです。

・QV-10のスイッチ、CCDカメラ部分の状態をレポートする
  05  'DS' 02  06
  -------------------  QV10のスイッチ、CCDカメラ部分の状態を
    06       XX   YY ZZ   レポートします。

  QV10からの返事XXはチェックサムです。
  返事YY、ZZは絞り警告(画面に出てくる●や○マーク)
  と、ボタンの状態(押されているかどうか)、REC/PLAYスイッチと
  CCDカメラ部分の状態を示します。
  YYの値
  MSB
  7 0x80  明るすぎ警告●
  6 0x40  暗すぎ警告○
  5 0x20  ?
  4 0x10  ?
  3 0x08  [-]ボタンが押されている
  2 0x04  [+]ボタンが押されている
  1 0x02  ?
  0 0x01  ?
  LSB
 
  ZZの値
  MSB
  7 0x80  CCDカメラ部分が反転位置にある
  6 0x40  REC/PLAYスイッチが PLAY位置にある
  5 0x20  PROTECTボタンが押されている
  4 0x10  DELボタンが押されている
  3 0x08  DISPボタンが押されている
  2 0x04  MODEボタンが押されている
  1 0x02  ZOOMボタンが押されている
  0 0x01  シャッターボタンが押されている
  LSB

  (QV-700/770では常に返事は 00 40になるようです。)

・画像にプロテクトをかける/はずす
  05  'DY'  XX  YY   06
  ---------------------   QV10の画像番号YYの画像にプロテクトを
    06            ZZ      かけたりはずしたりします。

  XXが0x01のときプロテクトをかける、00のときプロテクトをはずすす
  動作になります。
  ZZはチェックサムです。

・画像がプロテクトされているか、NormalかFineかをレポートする
  05  'DY' 02 XX  06
  ---------------------   QV10の画像番号XXの画像にプロテクトが
    06          YY  ZZ  かかっているかどうか、Normal画像か、Fine画像か
                          を問い合わせます。

  YYはチェックサムです。
  QV10からの返事ZZの値と画像の状態の対応は以下のとおりです。
  プロテクト  解像度 ZZの値
  off         480x240 0x00
  on          480x240 0x01
  off         640x480 0x02
  on          640x480 0x03

・画像データの転送ブロックサイズを変更する
  05  'PP' XX YY  06
  ---------------------   画像データとりだし、書き込みの際の転送ブロック
    06          ZZ       サイズ(デフォルト0x00 0x80の 128バイト)を変更します。

  XXは転送ブロックサイズの上位バイト、YYは下位バイトです。
  例えば、XX = 0x06、YY = 0x00 を指定した場合、転送ブロックサイズは
  0x0600 = 1536バイトになります。
  ZZはチェックサムです。

・電源ON/リセット時に表示される画像の指定
  05  'DV' XX   06
  ---------------------  電源ON、リセット時に表示される画像を指定します。
    06        YY         XXに画像番号を指定します。
                         YYはチェックサムです。

・画像番号を表示しない。
  05  'DM' 06
  ---------------------  LCD画面上の画像表示を消します。
    06   YY              YYはチェックサムです。

・本体バージョン?のレポート
  05  'SU'  06
  ------------------------  QV10の本体バージョン?と思われる値を
    06    XX   YY ZZ WW VV  レポートします。

  QV10からの返事XXはチェックサムです。
  返事のYY ZZは機種ID、WW VVはバージョンを意味するようです。
  林が調査した範囲では、本体とこの4バイトの関係は以下のとおりです。
  機種     YYZZWWVV
  QV10   0x00531719
  QV10   0x00538b8f
  QV70   0x00835321
  QV100  0x0103ba90
  QV300  0x01048dc0
  QV700  0x01a0e081
  QV770  0x01a10000


●QV-700/770で新設されたコマンド一覧
 QV-700/770では旧来(QV-10系/QV-100系)のコマンドに加え、
 新しいコマンドが扱えるようになっています。
 新しいコマンドを使用可能にするには'NP'コマンドで行いますが、
 'NP'コマンド発行以後も、旧来のコマンドは有効のようです。

・770/700系コマンドへの切り替え?
  05  'NP' 01  06       QV770からの返事60はチェックサムです。
  --------------------  
    06       60  

・メイン画像をJPEG形式でを取り出す
  05  'DA' XX  06 05  'DL'  06  05  'EM'              06
  ---------------------------------------------------
    06       YY     06    6f      06    6d ZZ ZZ ZZ ZZ
                                           画像のサイズ
  05 'EG'  06     12            06          
  --------------------------------------------------
   06   73         [画像データ]  [画像データ]

  06            06                  06
  ----------------------------......----------------
    [画像データ]  [画像データ]        02 00 00 03 FC
                                      エンドマーク?

  XXは画像番号を指定します。
  QV770からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV770からの返事6fはチェックサムです。
  QV770からの返事73はチェックサムです。
  ZZ ZZ ZZ ZZ の4バイトは画像データのサイズを示します。

  画像データの詳細
  02 WW WW JJ JJ JJ JJ JJ ........ 17 SS
        
  WW WW: データサイズ(2バイト)、通常00 80(128バイト)、
      エンドマーク直前の最後のデータはそのサイズ(00 80)以下
  JJ: データサイズ分の画像データ
      このデータはそのままJFIFになっています。
  SS: チェックサム
      2バイト目(先頭の02の直後)からSSの直前(17)までの総和
      の1の補数

・画像情報を得る
  05  'DA' XX  06 05  'DL'  06  
  ------------------------------
    06       YY     06    6f    
                                
  05 'CV'  06     12                             
  --------------------------------------------------
   06   66         02 00 0b [11byteのデータ] 17 SS  

  06
  ----------------
    02 00 00 03 FC
    エンドマーク?

  XXは画像番号を指定します。
  QV770からの返事YY(チェックサム)は(0x7a - XX)になります。
  QV770からの返事6fはチェックサムです。
  QV770からの返事66はチェックサムです。
  QV770からの返事SSはチェックサムです。

  11バイトのデータの内容は以下の通りです。
  1バイト目 圧縮モード 01 econo 02 normal 03 fine
  2バイト目 不明 00
  3バイト目 普通/パノラマ/ムービー 普通 01 連写 02 パノラマ 07 ムービー 08
  4バイト目 マクロかどうか 普通 01 マクロ 02
  5バイト目 不明 01
  6バイト目 不明 シャッタースピード/WB? 0a,09,0c,0e,0b
  7バイト目 不明 絞り? たぶん (F8)07 (F2)03 
  8バイト目 不明 0d
  9バイト目 不明 04
 10バイト目 不明 0d
 11バイト目 不明 01

●捕捉

コマンドに先だって行なわれる05送って06返事は1回だけでなく、
何回行なってもいいようです。単純に「生きとるか?」「はいな」
だと思います。

itojunさんからの指摘ですが、
16進  ASCIIコード 意味
  02  STX        転送はじめまっせ
  03  ETX        転送終わりますだ
  05  ENQ        元気? 
  06  ACK        おっけぃ または うけとりました
  12  DC2        ?????
  17  ETB        ブロックおしまい

だから、それなりに意味あるんじゃ? とのことです。
確かにいわれてみればそれっぽいですね。
また、画像データの読みだしはxmodemのプロトコルに似ているようだ、
とのご指摘もありました。さらにそれにもとづき、qvplayの画像データ
読みだし部分のエラーリカバリ部分を実装してくださいました。
(ありがとうございます>itojunさん)

画像データのチェックサムの算出方法、通信速度変更については
Brahmaさんより非常に有益な情報をいただきました。チェックサム
はデータだけじゃなくてデータサイズと0x17も足し込むというのが
盲点でした。
通信速度については115200baud以上は手持ちのI/Oカードが
対応してないので実験できませんでした。BrahmaさんのQVCOMの
ドキュメントにはover 57600はエラーが多くてだめだ、とあり
ましたが、100LXよりは体力に余裕のある?デスクトップマシン
だと115200でも大丈夫でした。

・その他細かい部分はcommand.c/command1.c/command2.cを
  参照してください。(をいをい) (^^)

●その他
Windows版のパソコンリンクソフトの動作見ていると
何度か05を送って06を受け取るという動作が妙に多い。
Windows版のパソコンリンクソフトは、基本は9600baud
でコマンドを送っており、画像データの読み込みの時だけ
19200baudや38400baudに変更している。

●未解明の謎コマンド/解析途中メモ

'DI''DK' 'DQ'

・Fineのこり枚数(100系のみ)?
  05  'Eb'  06
  ------------------------ 
    06   XX   XX
        cksum

・Normalのこり枚数(100系のみ)?
  05  'EB'  06
  ------------------------ 
    06   XX   XX
        cksum

・MQ 画像バイト数(100系のみ)?
・Mq 画像バイト数(100系のみ)?

----
QV770/700系のコマンド

・速度変更?
  05  'cb' 02  06
  ------------------------ 
    06       XX  
             '8'

・?
  05  'CX'    05
  ------------------------ 
    06     XX  01?
           'd'


・?
  05  'CF'    05
  ------------------------ 
    06     XX  00?
           'v'
           0x06 0x76 0x00 0x2d

・?
  05  'EC'    05
  ------------------------ 
    06     XX  01?
           'w'

'DY' 02 0d ??

'FT '

'SD' 0xf1 0xa1 0x80 0x00 0x00 0x00 0x06

'BC'  0x06
-------------  バッテリ関連
   0x7a   0x00
   chksum   ??result

'CX'

'CZ'

・?
  05  'ES'    06
  ------------------------ 
    06     0x67   00 00 00 0b
           'g'
           chksum


・JPEG形式の画像をQV-770へ書きこむ
  05  'MW'   06   [画像データ]  [画像データ]
  ---------------------------------------------------------
    06    5b    12            06            06

    [画像データ]  [画像データ]        02 00 00 03 FC
  ----------------------------......----------------
  06            06                  06

  05  'DJ'   06 
  --------------
    06    ZZ    



林謙一のホームページへ戻る