シリアル検証スケッチ


VS-RC003のシリアル関連についてですが、前回のスケッチでは動くもののデータの切り出し方にちょっと無駄がありました。
シリアルの情報は公式に開示されているのですが、細かな点が素人にはちょっとわかりづらいです。
コールバック、#プロンプト、[CR]、[LR]の受信順について厳密に理解しておくため、改めて専用のスケッチを作って検証しておきたいと思います。いそがばまわれ。




使うのは例によってハードウェアシリアルの安定性も高いMEGAです。
Serial1のTX,RXピンをVS-RC003のRX,TXとそれぞれ繋ぎます。
LeonardoやMICROでもたぶん大丈夫だと思います。


//VS-RC003等から送られてくるデータの順番を可視化するプログラム。
//特例として、復帰記号[CR]は「C」、改行記号[LF]は「L」として可視化する。

int LEN = 128;//読み込むシリアル文字列の長さ。仮に決める。
String WRITE_MSG ="r 2009dc 04";//送信したいシリアル文字列はここで指定する。

void setup() {
 Serial.begin(115200); // 115200bpsでPCモニタ用ポートを開く
 Serial1.begin(115200);// 115200bpsでVS-RC003通信用ポートを開く
}

void loop() {
 char VSmsgs[LEN];// 読み取ったシリアルを入れる配列を宣言。
 Serial1.println(WRITE_MSG);//こちらから送信するシリアル命令。
 delay(30);//このディレイが小さすぎると失敗しやすい。
 //if (Serial1.available() > 0 ) {
   for (int i = 0; i < LEN; i++) {
     char data = Serial1.read();
     if (data == 0x0d) {//受信した文字が復帰記号[CR]だったら配列に「C」を代入して可視化する。
       VSmsgs[i] = 0x43;
     }
     else if (data == 0x0a) {//受信した文字が改行記号[LF]だったら配列「L」を代入して可視化する。
       VSmsgs[i] = 0x4c;
     }
     else {
       VSmsgs[i] = data;//受信した文字が上記以外なら、そのまま配列に入れる。
     }
   }
 //}
 Serial.println("Arduino read...");
 Serial.println(VSmsgs);//取得データを表示。
 Serial.println("from Serial1.");
 Serial.println();
 delay (1000);
}




まず、読み込みのテストです。

r 2009dc 04[CR][LR]を送信すると、帰ってくるのは、

Arduino read...
r 2009dc 04C#L
from Serial1.

Arduino read...
r 2009dc 04C#L#2009dc 02 00 d2 0f CL
from Serial1.

Arduino read...
r 2009dc 04C#L#2009dc 02 00 d2 0f CL
from Serial1.
(以降繰り返し)

という結果になりました。
Cは[CR]、Lは[LF]を示します。
1発目はVS-RC003からの返信がこないことが多いので扱いに注意が必要ということがわかります。
最初の#は、VS-RC003からのコマンド受領合図です。[CR]を受け取るとまずこの#を返してきます。
また、2回目の#よりも前の文字列は、送信したコマンドのコールバック(受領したデータを一文字ずつ返してくる仕様)になりますので、データとしては不要なものです。
[LF]#と2バイト連なる文字列を受け取ってから、次の[CR]が来るまでの文字列を読み取るようにプログラムすれば、欲しいデータを切り出せそうです。



次に、書き込みのテストです。

w 2009f6 01 00を送信すると、帰ってくるのは、

Arduino read...
w 2009f6 01 00C#L
from Serial1.

Arduino read...
w 2009f6 01 00C#L
from Serial1.

Arduino read...
w 2009f6 01 00C#L
from Serial1.
(以降繰り返し)

という結果になりました。
書き込みコマンドを受領したVS-RC003は、[CR]を受け取ってすぐに#を返してくれることがわかります。
書き込みが成功しているかのチェックは、もう一度該当箇所を読み込んで比較するのが良さそうです。



そこで、書き込んだ後に読み込み実行するスケッチも簡易的に書いてみました。
こちらを実行すると、ずらずらと改行なしで結果を出力します。
どういう順番でシリアルが帰ってくるのでしょうか。


//VS-RC003等から送られてくるデータの順番を可視化するプログラム。
//特例として、復帰記号[CR]は「C」、改行記号[LF]は「L」として可視化する。

int LEN = 128;//読み込むシリアル文字列の長さ。仮に決める。
String WRITE_MSG1 = "w 2009f6 00 00"; //送信したいシリアル文字列その1を指定。
String WRITE_MSG2 = "r 2009f6 02"; //送信したいシリアル文字列その2を指定。
void setup() {
 Serial.begin(115200); // 115200bpsでPCモニタ用ポートを開く
 Serial1.begin(115200);// 115200bpsでVS-RC003通信用ポートを開く
}

void loop() {
 char VSmsgs1[LEN];// 読み取ったシリアルを入れる配列を宣言。
 Serial1.println(WRITE_MSG1);//こちらから送信するシリアル命令。
 delay(30);//このディレイが小さすぎると失敗しやすい。
 for (int i = 0; i < LEN; i++) {
   char data = Serial1.read();
   if (data == 0x0d) {//受信した文字が復帰記号[CR]だったら配列に「C」を代入して可視化する。
     VSmsgs1[i] = 0x43;
   }
   else if (data == 0x0a) {//受信した文字が改行記号[LF]だったら配列「L」を代入して可視化する。
     VSmsgs1[i] = 0x4c;
   }
   else {
     VSmsgs1[i] = data;//受信した文字が上記以外なら、そのまま配列に入れる。
   }
 }

 char VSmsgs2[LEN];// 読み取ったシリアルを入れる配列を宣言。
 Serial1.println(WRITE_MSG2);//こちらから送信するシリアル命令。
 delay(30);//このディレイが小さすぎると失敗しやすい。
 for (int i = 0; i < LEN; i++) {
   char data = Serial1.read();
   if (data == 0x0d) {//受信した文字が復帰記号[CR]だったら配列に「C」を代入して可視化する。
     VSmsgs2[i] = 0x43;
   }
   else if (data == 0x0a) {//受信した文字が改行記号[LF]だったら配列「L」を代入して可視化する。
     VSmsgs2[i] = 0x4c;
   }
   else {
     VSmsgs2[i] = data;//受信した文字が上記以外なら、そのまま配列に入れる。
   }
 }
 Serial.print(VSmsgs1);//取得データを改行なしで表示。
 Serial.print(VSmsgs2);//取得データを改行なしで表示。
 delay (100);
}



実行結果は、
w 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CLw 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CLw 2009f6 00 00C#Lr 2009f6 02C#L#2009f6 00 00 CL (以下繰り返し)
となります。

ここから上手に該当箇所を切り出すことができれば、ArduinoとVS-RC003は晴れて通信開通となる・・・はずです。
パズルゲームを遊んでいるようで、面倒ながらも楽しいです^^
スポンサーサイト

テーマ : 自然科学
ジャンル : 学問・文化・芸術

コメントの投稿

非公開コメント

プロフィール

二名川(ニナガワ)

Author:二名川(ニナガワ)
ホビーロボットをレトロゲームが発展したものと捉えて楽しく遊び倒します。
子供が夢を見ている時間帯に稼働します。

宣伝:電子出版しました。
「コンソロイド ガイドブック」
46107_CONSOLOID_GUID_FACE_200.jpg





■作成中の機体
汎用ヒト型決戦遊具 ~RX計画~
RX-7.5 ゼロタンク
RRf-0.6 ゼニィ
RXM-7.9 ゼムネス
RX-7.5R 量産型ゼロタンク
RX-7.5Fp ファミタンク仮設1号
RX-7.7 ゼロキャノン
RX-7.8 ゼログレイ
SMS-0.1 ゼロライナー
以下続く

ブログ内検索
最近の記事
最近のコメント
カテゴリ
月別アーカイブ
リンク