(本文書はオリジナルの Protocol2.pdf を勝手に解釈したものです)

◎シリアルプロトコルパラメータ
1.バイト長は8bit
2.ストップビットは1
3.パリティ無し
4.ボーレートはRS232C的には9600だけど、USBなので適当に。
5.フローコントロールはRS232C的にはRTS/CTSだけど適当に。

Tiraには"6バイトモード"と"タイミングモード"の2つのモードがあります。
これら2つのモード違いは、入力されるIRデータが、どのように処理されるかが異なるだけです。
後はほとんど違いないです。

◎6バイトモード
このモードでは、入力IRデータは6バイトワードのデータとして表されます。
このモードは動作確認用(テスト用)といった目的で使いましょう。
このモードで得たIRデータを送信に使うことはできません。

◎タイミングモード
このモードでは、受信したIRコードを、再生するためのタイミング情報等、全てをキャプチャして、
完全な形で返します。
これらは、
  <バースト期間長>,<スペース期間長>,<バースト期間長>,...
というフォーマットで返してきます(バースト期間長は"1"の期間、スペース期間長は"0"の期間と考えてよい)。

タイミングモードにおけるTiraからの応答は以下のフォーマットになります。

  P0 S0 P1 S1 P2 .... Pn 0x00 0x00 CW 0xB2

Pフィールドはパルス長を表し、Sフィールドはスペース長を表します。

Pフィールド、Sフィールドともに2バイト値で表されます。

実際のデータの後に、0x00, 0x00, CW, 0xB2というデータが続きます。
PフィールドとSフィールドの値は0であることは無いので、0x00, 0x00の2バイトのパターンを見付けることで
データの区切りとすることができます。

さて、P(もしくはS)は2バイトであって、"この値*8μS"が実際のパルス幅になります。

CW(Clock Word)フィールドは、入力IR信号変調周波数に関する値です。
これは1バイト値で、0.5μS単位。
変調周波数は次の式で求められます。
F = 2000000 / CW
例えば、CWが0x46(10進値で70)の場合、パルス幅は35μSで変調周波数は28.571kHzです。

◎コマンド
1."IR"コマンド
  送出データ:0x49, 0x52
  本コマンドで、Tira-2は6バイトモードに移行する。
  応答としては、"OK"(0x4F,0x4B)を返す。
2."IC"コマンド
  送出データ:0x49, 0x43, 0x00, 0x00
  本コマンドで、Tira-2はタイミングモードに移行する。
  応答としては、"OIC"(0x4F,0x49,0x43)を返す。
3."ISW"コマンド
  送出データ:0x49, 0x53, 0x57, , 
  本コマンドで、リモートウェイクアップモードに移行する。
  応答としては、"OIS"(0x4F,0x49,0x53)を返す。
  6バイトモードでの使用であって、が一致したときにウェイクアップするらしい。
  よく知らん。
4."IX"コマンド
  送出データ:0x49, 0x58, , , , 
  本コマンドでIRデータを送出する。
  成功すれば、応答として、"OIX"(0x4F,0x49,0x58)を返す。
  CWは、タイミングモードで受信したのと同じCWデータを指定。
  MODEは0x00を指定。
  BSAとIRデータに関しては別記。
5."IV"(0x49,0x56)コマンド
  送出データ:0x49, 0x56
  本コマンドでバージョンを確認する。
  応答はASCIIで"Tira-2.2"とか言ってくる。何か変。
6."IP"(0x49,0x50)コマンド
  Tira-2.1では無用らしい。

コマンドを発行してから応答までは若干時間がかかる。
IRコマンドとかなら0.1s程度でいいけど、
IXコマンドで長いコマンドを送ったときとかはもう少し待った方がいいかも。

----

サンプルプログラム
・キャプチャして結果をファイルに吐き出すプログラム
・上記プログラムで作ったデータを送出するプログラム
どっちもPerlで作ったもので、Device::SerialPortを使ってます。
そんなに大したことしてないけど、"-h"で簡単なヘルプが出ます。
デバイス名とかベタ書きなので、適当に。