UP:目次
BACK:1 ビジョンシステム概要 
NEXT:3.1 ビデオキャプチャシステムの仕様 


2.1 ホスト〜ロボット間の通信プロトコル
 

serial.ccのf5call()によって、送信文字列を生成、シリアルポートへの送り込まれる。

1  : void Serial::f5call(int fd,struct cmd_list cmd[]){

引数 int fd は、シリアルポートのファイルディスクリプタです。
open関数でシリアルポートを開いた際の戻り値を代入します。

serial.hによって、構造体 cmd_listは、
struct cmd_list {
  char cmd;
  int para[5];
  cmd_list(){
    cmd = 0;
    para[0]=para[1]=para[2]=para[3]=para[4]=0;
  }
}; 
と定義と初期化を行っています。


2  :   int size;
3  :   int BCC;
4  :   char send_data[128];
5  :
6  :   int robo_no;
7  :   int i,j;
8  :
9  :   cout << "f5call come in" << endl;


10 :   BCC = 0;
11 :   size=43;
12 :   robo_no = 0x3a;
13 :   BCC ^= robo_no;
14 :   BCC ^= 'n';
15 :
16 :   for(i=0;i<5;i++){
17 :     BCC ^= ' ';
18 :     BCC ^= cmd[i].cmd;
19 :     for(j=0;j<3;j++){
20 :       BCC ^= cmd[i].para[j]&0xFF;
21 :       BCC ^= (cmd[i].para[j]>>8)&0xFF;
22 :     }
23 :   }
24 :

BCCとは、Block Check Caracterの意味で、各ブロックごとに伝送エラーを検査するために付加するエラー検査文字文字である。送信側でBCC文字を計算するアルゴリズムと同じアルゴリズムで、受信側でもBCC文字を計算して伝送エラーの有無を検査する。*1

BCCの計算は全ての@TBN(コマンドヘッダとバイナリデータ送信コマンド)を除く全ての送信データの論理演算の結果です。



 
25 :   sprintf(send_data,
26 :           "@TBN255%03d%cn %c%c%c%c%c%c%c %c%c%c%c%c%c%c %c%c%c%c%c%c%c %c%c%c%c%c%c%c %c%c%c%c%c%c%c%c\r\n"
27 :           , size , robo_no
28 :           ,cmd[0].cmd
29 :           ,(char)(cmd[0].para[0]>>8)&0xFF , (char)cmd[0].para[0]&0xFF
30 :           ,(char)(cmd[0].para[1]>>8)&0xFF , (char)cmd[0].para[1]&0xFF
31 :           ,(char)(cmd[0].para[2]>>8)&0xFF , (char)cmd[0].para[2]&0xFF
32 :
33 :           ,cmd[1].cmd
34 :           ,(char)(cmd[1].para[0]>>8)&0xFF , (char)cmd[1].para[0]&0xFF
35 :           ,(char)(cmd[1].para[1]>>8)&0xFF , (char)cmd[1].para[1]&0xFF
36 :           ,(char)(cmd[1].para[2]>>8)&0xFF , (char)cmd[1].para[2]&0xFF
37 :
38 :           ,(char)cmd[2].cmd
39 :           ,(char)(cmd[2].para[0]>>8)&0xFF ,
(char)cmd[2].para[0]&0xFF
40 :           ,(char)(cmd[2].para[1]>>8)&0xFF , (char)cmd[2].para[1]&0xFF
41 :           ,(char)(cmd[2].para[2]>>8)&0xFF , (char)cmd[2].para[2]&0xFF
42 :
43 :           ,cmd[3].cmd
44 :           ,(char)(cmd[3].para[0]>>8)&0xFF , (char)cmd[3].para[0]&0xFF
45 :           ,(char)(cmd[3].para[1]>>8)&0xFF , (char)cmd[3].para[1]&0xFF
46 :           ,(char)(cmd[3].para[2]>>8)&0xFF , (char)cmd[3].para[2]&0xFF
47 :
48 :           ,cmd[4].cmd
49 :           ,(char)(cmd[4].para[0]>>8)&0xFF , (char)cmd[4].para[0]&0xFF
50 :           ,(char)(cmd[4].para[1]>>8)&0xFF , (char)cmd[4].para[1]&0xFF
51 :           ,(char)(cmd[4].para[2]>>8)&0xFF , (char)cmd[4].para[2]&0xFF
52 :
53 :           ,(char)BCC&0xFF
54 :           );
送信コマンド
宛先
データ量(byte)
3AH(ロボットナンバー10)
n
(スペース)
1台目 コマンド
第1パラメータの上位8ビット
第1パラメータの下位8ビット
第2パラメータの上位8ビット
第2パラメータの下位8ビット
第3パラメータの上位8ビット
第3パラメータの下位8ビット
(スペース)


この先、5台目までのコマンドと各パラメータが、
続きます。
(次の台のつなぎ目にはスペースが入ります。)

(スペース)
BCC
(ブロックチェックキャラクタ)
\r(CR)
\n(LF)
表1:送信文字列の形式

各送信コマンド・パラメータは、25行目の sprintf() で send_data に表1の送信文字列の形式を用いて代入される。ここではパケット通信モードのバイナリデータ送信コマンドTBNを用いている。以下にそのコマンドについての詳細を述べる。

フォーマット*2
@TBN [宛先アドレス] [メッセージバイト数] [メッセージ] [CL] [RF]
@ コマンドヘッダ
TBN バイナリデータ送信コマンド
宛先アドレス 宛先の無線アドレス(000〜239)
同報通信の場合(255)
メッセージバイト数 メッセージのバイト数(001〜255)
送信元アドレス 000〜254
メッセージ 任意のバイナリデータ(255バイト以下)
CL RF ターミネータ(各1バイト)

レスポンス*2
P0 正常終了
P1 コマンド受理、データ送信中
N0 コマンドエラー
N1 データ送信失敗(宛先の無線モデムの応答なし)
N2 データ送信失敗(宛先の無線モデムの受信禁止)
N3 データ送信失敗(宛先の無線モデムの受信バッファがフルで受信不可)


55 : #if DEBUG
56 :   for(i = 0;i<55;i++) printf("%3x ",send_data[i]);
57 :   puts("");
58 : #endif
59 :   write(fd_serial,&send_data,55);
60 :   while(get_response() != 1)return;
61 :}

最後に、シリアルポートへ生成した送信文字列送り込み、逆にシリアルポートから'P0'が帰ってくるのを待ちます。


NEXT:3.1 ビデオキャプチャシステムの仕様