C

GR-SAKURAでシリアル通信(かふぇるね補足)

以前、GR-SAKURAのシリアル通信について書きましたがかふぇるねで質問があがっていましたので回答しました。

元ソースは質問者さんの記事をご参照ください。以下は私が修正した内容です。

/*GR-SAKURA Sketch Template Version: V1.08*/

#include <rxduino.h>
#include <ctype.h>

#define INTERVAL 100

void setup(){

    pinMode(PIN_LED1, OUTPUT);
    Serial.begin(9600); // for USB CDC
    for(;digitalRead(PIN_SW) == 1;){/* TeraTaermを起動・接続してからSwを押すこと */
        digitalWrite(PIN_LED1, 1); 
        delay(500);
        digitalWrite(PIN_LED1, 0);
        delay(500);
    }
}

void loop(){
    char c;
    int i = 0; // ループ用
    char cStr[20]; // 文字列格納用
    
    Serial.println("start"); // 出力
    for(i = 0; i < sizeof(cStr);){
        if ( Serial.available() > 0 ) {
            c = Serial.read();
            if (isdigit( c )) { // 数字の時は文字列追加
                cStr[i++] = c;    /* 文字格納後、インデックスインクリメント*/
                cStr[i] = '\0';   /* 終端処理 */
                if (i + 1 == sizeof(cStr)) { // バッファが一杯になったときも終了
                    break;
                }
            }else if (i) { // 1文字以上受信していて数字以外の文字を受信した時は文字列受信終了
                break;
            }
         }
    }
    Serial.println( cStr ); // 出力
}

プログラムの方ですが、文字が数字であるかを判定するためにctype.hを追加しています(line 4)。同時に受信した文字が数字であるかの判定をisdigit(char)に置き換えました(line 29)。
文字列の終端処理は文字格納の度に行いました(line 31)。
cStrは折角文字列になったので、atoi()などせずに、そのまま送信します(line 40)

続いてTeraTermの方ですが、Enterを押した時の送信データを設定します。
TeraTermメニューの設定、端末より設定画面を開きます。

serimon02

改行コードはCR+LFに切り替えます。また、ローカルエコーを有効にします。

仮に改行がCRだったらどうなるかというと

serimon03

CRによってカーソルが初期位置に戻り、その位置から受信データを表示するので、動作としては上書きされたことになり、結果として何も起きていないように見えます。

改行がCR+LFだったら

serimon04

CRまでは動作が同じですが、LF(Line Feed)が加わることによってカーソルが1段進み、次の行に受信データを表示することになります。

動作例は下記のようになります。

serimon01

数字はデータが積み重ねられ、数字以外(英字や改行)でGR-SAKURAからデータをもらいます。バッファフルにおいても正常に動作しています。

ABOUT ME
Nozomu.Kon
トータルソフトウェアコーディネーターがあなたのお困りを即時に解決!