• 締切済み

PICマイコンを用いてのシリアル通信で、プログラムのループが2周目になると上手く動作しません。

PIC16f88を用いて、パソコンとシリアル通信を行いたく、その確認の為以下のプログラムを作成しました。 #include<16f88.h> #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP #device ADC=10 #use delay(clock=20000000) #use fast_io(B) #use rs232(BAUD=9600,XMIT=PIN_B5,RCV=PIN_B2) #include <stdlib.h> void main() { int i; long data,data1,data2; long idata[10]; while(1) { printf("start!!\r\n"); gets(idata); data1 = atol(idata); data2 = data1 + (long)5; printf("入力値 %ld\r\n",data1); printf("計算後 %ld\r\n",data2); if ( 20 > data1){ printf("small\r\n"); } if ( 20 < data1){ printf("big\r\n"); } } } 入力した値、入力値に+5した値、また入力値をif文での条件で判別できるかを確認しています。実行結果は以下になりました(ハイパーターミナル上の結果を載せます)。 START!! 9     ←(これは入力した値です) 入力値9 計算後14 small START!! 15 入力値0 計算後5 small START!! 1 入力値0 計算後5 small ・ ・ ・ と、一回目のループは設計通りの動作が行えましたが、2回目のループ以降、何を入力しても”0”が返ってきてしまいます。問題点や改善点がわかる方、よろしくお願いします。

みんなの回答

  • 246riser
  • ベストアンサー率50% (2/4)
回答No.1

明確な回答ではありませんが・・・ gets(idata); の次の行で、idata[0]から[9]までの中身をprintfで見てみたらどうでしょうか?gets関数は失敗すると(数値以外を入力したりすると)NULLが戻るようですし。 一回目は成功しているというのは、一番初めの入力だからでしょうね。ちゃんとidata[0]に数値が入る。 二回目にはidata[0]に数値以外の何かが入ってしまっていて、NULLが返っているような感じがします。予想としては、二回目のループに戻る前に画面に出力される"\r"とか"\n"とかではないでしょうか。 そのあたりはprintfで見てみれば分かると思います。

関連するQ&A