前へ 目次 次へ
調歩同期式シリアルデータ「受信」
 

シリアルデータ受信関数として、rs_getcを紹介しましたが、 これを使って複数のデータを受け取ろうとしたとき、 正しく利用しないと思った通りにデータを受け取ることができません。 ここでは、3桁の数値データ(000から249までと限定しておきます)を受け取り、 その値を返すプログラムを作ってみましょう。 入力には必ず3桁を用い、50を入力するときなどは050と入力することとします。

今回も、BestTechnologyの、 GCC Developer Liteに付属する sci.cの関数を利用することにします。

/*
  シリアルで3桁の数字をもらい、その値を返す(sci01.c)
  2004/07/02(Fri)
*/

#include<3664.h>
#include<sci.c>


int main(void)
{
  int angle;
  char angc[4];
  
  InitSCI3(br57600);        /* シリアルポートの初期化 */

  while(1){
    while(1){
      rs_puts("input number(000-249):");
      angc[0]=rs_getc();
      angle=(angc[0]-'0')*100;
      angc[1]=rs_getc();
      angle+=(angc[1]-'0')*10;
      angc[2]=rs_getc();
      angle+=angc[2]-'0';
      angc[3]=NULL;
      rs_puts ("\n\r");
      if(angle>=0 && angle<250){    /* 数値を0から250までに制限 */
        rs_puts("You input:");
        rs_puts(IntToDec(angle, 3, angc));
        rs_puts ("\n\r");
        break;
      }else{
        rs_puts("bat number:");
        rs_puts(IntToDec(angle, 3, angc));
        rs_puts ("\n\r");
      }
    }
  }
  return(0);
}


angc[0]=rs_getc();

受け取った1文字のデータを配列angcの最初の要素に格納しています。 2文字目はangc[1]へ、3文字目はangc[2]へ格納しています。


angle=(angc[0]-'0')*100;

受け取った1文字のデータを数値に直しています。 そのまま返しても良いのですが、 実際には受け取った数値をint型に格納して作業することが多いかと思い、 ここではあえて一旦int型に変換してみました。 3桁という指定をしているので、最初の文字は100の位になります。 このため100を掛けています。 本来でしたら、この部分でエラー処理を入れるべきでしょうが、 ここでは入れていません。


rs_puts(IntToDec(angle, 3, angc));

ここでは、返すデータも、 int型に変換したものをchar型に再度直して送り返しています。


rs_puts ("\n\r");

見やすくする為に改行コードを送っています。 ハイパーターミナルだと、\rで改行して行の先頭に戻り、 \nは改行だけで行の先頭には戻らないようです。 ここでは念のため両方入れておきました。


実行例

2004/07/02(Fri)
AKI-H8/3664 QFP版のトップページへ
トップページへ
SEO [PR] 爆速!無料ブログ 無料ホームページ開設 無料ライブ放送