UP:目次 |
BACK:1 ビジョンシステム概要 |
NEXT:3.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 : ); |
|
各送信コマンド・パラメータは、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'が帰ってくるのを待ちます。