遠隔君のコマンド仕様
2011-11-16
遠隔君の制御は、シリアル通信によるコマンド制御です。基本的に、ANT側は常に受信状態であり、RIG側からのコマンドに従って処理を行う格好になります。
シリアル通信には様々な手順がありますが、大きく分けると半二重通信と全二重通信があります。
半二重は、丁度トランシーバーと同じで、自局が送信中は相手局が受信中・・・というように、「送り」と「受け」がある時点では決まっているという通信方法です。一方の全二重は、双方向で自由に通信できるもの・・・その代表例が「電話」ですね。
遠隔君の仕様を考えると、ANT側がコマンドを常に受け付けられるような準備をし、コマンドを処理した後にその結果を返す、RIG側はコマンドを送信したら受信状態になってその応答を待つという形になりますから、正に半二重通信で良いわけです。
さらに、送受信するデータ量はいくらでも・・・なんですが、どこで送信データが終わるのかを受信側が認識できないと、いつまで受信していたらいいのか解りません。これを知る方法もいくつか考えられますが、基も簡単なのが固定長にするか終了符号(ターミネーターと言います)を決めておくかの何れかです。
その上で、送信データが相手側にきちんと伝わったか・・・これもできる限り確認できるようにしておく方がよく、一般に送信データを1バイトずつ「ある計算式」で計算してその答えを送信データの末尾に付けて送り出し、受信側は受信データを「ある計算式」で計算して、その結果と最後に受信したデータが一致したら「きちんと受信できた」といった確認方法をよく使います。この計算結果として送るデータを「チェックサム」と言います(他の名称もあります)。
・・・と、このようにいろいろ考えなければならないのですが、今回は以下のようにエイヤで決めました。
・ 送受信文字はASCII文字の英数字(英字は大文字)
・ ターミネータとしてCR(キャリッジリターン)を付ける
・ チェックサムはひとまず付けない
さて、コマンドとレスポンスは、以下のようにしました。
※ 「↓」はCR
ANT側もRIG側もターミネータまで受信した後、先頭から2文字目で「何のコマンド」「何のレスポンス」を判別する形になります。
ANT側は、受信したコマンドが(つまり先頭から2文字目が)S/R/Wのいずれでもない場合、そのコマンドを無視します。また、リレー切替コマンドのパラメータ部分は設定される値が決まっていますが、もし範囲外の文字を受信した場合も無視します。つまり、RIG側にとって「レスポンスが返ってこない」という事象が存在するため、コマンド送出後は「レスポンス待ちタイマ」を設定し、その間に応答がなければ同じコマンドを再送します。 再送間隔は1秒程度で良いでしょう。
RIG側も同様に、レスポンスの先頭から2文字目のチェックNG、SWR測定レスポンスのパラメータが範囲外の場合、そのレスポンスは無効として扱います。
キャラクタ+CRの形の形式にしておくと、Windows添付のハイパーターミナルやフリーソフト(TERATERMというソフトが有名です)を使って相手側の「フリ」をさせ、デバッグを楽に進めることができます。
シリアル通信には様々な手順がありますが、大きく分けると半二重通信と全二重通信があります。
半二重は、丁度トランシーバーと同じで、自局が送信中は相手局が受信中・・・というように、「送り」と「受け」がある時点では決まっているという通信方法です。一方の全二重は、双方向で自由に通信できるもの・・・その代表例が「電話」ですね。
遠隔君の仕様を考えると、ANT側がコマンドを常に受け付けられるような準備をし、コマンドを処理した後にその結果を返す、RIG側はコマンドを送信したら受信状態になってその応答を待つという形になりますから、正に半二重通信で良いわけです。
さらに、送受信するデータ量はいくらでも・・・なんですが、どこで送信データが終わるのかを受信側が認識できないと、いつまで受信していたらいいのか解りません。これを知る方法もいくつか考えられますが、基も簡単なのが固定長にするか終了符号(ターミネーターと言います)を決めておくかの何れかです。
その上で、送信データが相手側にきちんと伝わったか・・・これもできる限り確認できるようにしておく方がよく、一般に送信データを1バイトずつ「ある計算式」で計算してその答えを送信データの末尾に付けて送り出し、受信側は受信データを「ある計算式」で計算して、その結果と最後に受信したデータが一致したら「きちんと受信できた」といった確認方法をよく使います。この計算結果として送るデータを「チェックサム」と言います(他の名称もあります)。
・・・と、このようにいろいろ考えなければならないのですが、今回は以下のようにエイヤで決めました。
・ 送受信文字はASCII文字の英数字(英字は大文字)
・ ターミネータとしてCR(キャリッジリターン)を付ける
・ チェックサムはひとまず付けない
さて、コマンドとレスポンスは、以下のようにしました。
コマンド名 | ANT側の動き | コマンド | レスポンス | パラメータ |
動作確認 | 単に応答を返す | CS↓ | RS↓ | |
リレー切替 | 指定された番号に リレーを切り替える | CRnnnnn↓ | RR↓ | nnnnn= 00000-FFFFF |
SWR測定 | 進行電圧と反射 電圧を返す | CW↓ | RWxxxyyy↓ | xxx=進行 yyy=反射 000-3E8 |
ANT側もRIG側もターミネータまで受信した後、先頭から2文字目で「何のコマンド」「何のレスポンス」を判別する形になります。
ANT側は、受信したコマンドが(つまり先頭から2文字目が)S/R/Wのいずれでもない場合、そのコマンドを無視します。また、リレー切替コマンドのパラメータ部分は設定される値が決まっていますが、もし範囲外の文字を受信した場合も無視します。つまり、RIG側にとって「レスポンスが返ってこない」という事象が存在するため、コマンド送出後は「レスポンス待ちタイマ」を設定し、その間に応答がなければ同じコマンドを再送します。 再送間隔は1秒程度で良いでしょう。
RIG側も同様に、レスポンスの先頭から2文字目のチェックNG、SWR測定レスポンスのパラメータが範囲外の場合、そのレスポンスは無効として扱います。
キャラクタ+CRの形の形式にしておくと、Windows添付のハイパーターミナルやフリーソフト(TERATERMというソフトが有名です)を使って相手側の「フリ」をさせ、デバッグを楽に進めることができます。
- 関連記事