• ベストアンサー

C言語のプログラミングについて

マイコン内部のタイマーを使ってmainのプログラムにprintf文を記述することでteraterm上に1秒経過、2秒経過、3秒経過と表示させたいのですが、どのように表示させるのでしょうか? 10 [ms]ごとにタイマの割り込み要求を出すプログラムは作成したのですが、mainプログラムの表示のやり方がわかりません。 マイコンとパソコンの通信はできるようにしてあります。 回答お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

「マイコンとパソコンは通信できるようになっている」のですよね。 これが具体的にはどういう通信なのかにもよりますが。 たとえば、putchar('A'); で、TeraTerm 側に、A が表示されるというようなものが準備できているということでしょうか。 さらに、10msごとに割り込みを発生させるプログラムは既に作成済みということですね。 だとすると、10msごとに、関数(下記の例では、void 10Int())を呼び出すことができます。 printf() で UART にデータを送る事ができるのであれば、下記のソースで良いかなと思います。 あと、TeraTerm で受けるとすると、"\n" じゃなくて、"\r" のほうが一般的かもしれません。 voltile int m10Count; int main() { int secCount; m10Count = 0; // ここでタイマ割り込みを許可 // 具体的な方法は処理系により様々 while(1) { if(checkDiff != (m10Count / 100)) { secCount = m10Count / 100; printf("%d秒後\n", secCount); } } return 0; } #pragma interrupt(m10Int) // ここの指定は処理系により様々 void m10Int() { m10Count++; } UARTから出力できるようなprintf()がない場合は sprintf() があるなら…… char buff[64]; sprintf(buff, "%d秒後\n", secCout); for(i = 0; buff[i]; putchar(buff[i++])); という感じで。(putchar() は具体的にパソコンに1バイト送信する関数に置き換えるとして) sprintf() もない場合には…… たとえば、http://www.nest4.net/tec/strnum.html で紹介されているライブラリを使って、 char buff[] = "xxxx秒後\n"; toStr(secCount, buff, 4, 10); zeroSuppress(buff); for(i = 0; buff[i]; putchar(buff[i++])); こんな感じでいけるかと。

ibayama
質問者

お礼

詳しい解説・回答・サンプルプログラムありがとうございます。 早速プログラム動かしてみたいと思います。

その他の回答 (7)

回答No.8

さて、この状態で、出力が発生するためには、m10Count が、カウントアップされる必要があります。 ということは、m10Int() が呼び出される必要があります。 「10msごとに割り込み要求を出すプログラム」で、10msごとに m10Int() を呼び出すようにすれば、OKです。 具体的な方法は、それこそマイコンの機種・ボードの回路によって変わってきます。 「割り込みプログラムは作成した」という前提で回答してきましたので、これ以上はご遠慮いたします。

ibayama
質問者

お礼

素人質問ばかりで申し訳ありませんでした。 多くの回答ありがとうございました。 プログラミングがんばって完成させたいと思います。

回答No.7

スペースも含めて、正確に書いていただいたおかげで助かりましたが……。 != はこれでひとつの演算子です。! と = の間にスペースは入れません。 == や ++ や += と同じ(意味は違いますけど)

ibayama
質問者

補足

何度も回答すいません スペースを消したらコンパイルできました。 でも teraterm上では何も動かなくなってしまいました。 どうしたら・・・・・ for文のほうも必要なのでしょうか また、for(i = 0; buff[i]; putchar(buff[i++])); 分のiというのは何を表しているのでしょうか? 本当に申し訳ないのですが、できれば回答お願いします。 ...

回答No.6

TeraTerm 上では、望んだものではないにしろとにかく動いていたわけですよね? それでいて、「ソースの ! が認識されない」のですか? そもそも、「「!」の記述が認識されません。」とはどういう意味でしょうか? エラーですか? 警告ですか? それでしたら、正しい内容を書いてください。 それでないのなら、「認識されない」とはどういうことで、「認識されない」と判断した根拠はどこにあるのか? そういったことがないと、さすがに回答不能です。

ibayama
質問者

補足

わかりにくい補足で申し訳ないです。 if(secCount ! = (m10Count / 100))の部分なのですが、 「!」を抜いたらコンパイルすることができるのですが、 if(secCount ! = (m10Count / 100))のままだと syntax errorと表示されます。 何度もすみませんが回答お願いします。

回答No.5

さらに、2カ所ほど訂正です。 voltile int m10Count; は正しくは、 volatile int m10Count; sprintf(buff, "%d秒後\n", secCout); は、正しくは、sprintf(buff, "%d秒後\n", secCount); です。 いずれも、このままだとエラーになるので見当は付いたとは思いますが。 だめですね、こんなところで間違えるようでは>自分。

回答No.4

No.3 ですが……。 > teraterm上で > 「0 b .」とずっと表示され続けてしまいます。 ずっと表示され続けるということですが 1)どのくらいの頻度でしょうか?   1秒間隔で表示されるのなら、単なる表示の問題   ずら~と表示されるのなら、表示の条件を作っている部分(if(secCount != (m10Count / 100)) とその次の、secCount = m10Count / 100;)が変   1秒じゃない、一定の間隔なら、割り込みの設定が変   くらいの切り分けはできて欲しいのですが。 2)表示の点   まずは、putchar() で、A を毎回表示してみましょう。   正しく表示できるのなら(タイミングも含めて)漢字の扱いとか、buff 周りの設定が変 こんな所かなとは思いますが。 まさかとは思いますが、if(checkDiff != (m10Count / 100)) の間違いは修正されましたよね?

ibayama
質問者

補足

何度も回答ありがとうございます。 まず、プログラムのソースなんですが、 「!」の記述が認識されません。 別の書き方はないでしょうか?

回答No.3

No.2 ですが、訂正です。 int secCount = 0; // 初期化忘れですね m10Count = 0; if(checkDiff != (m10Count / 100)) 正しくは、 if(secCount != (m10Count / 100)) ですね。 途中で気が変わって、変数名直したのが漏れていました。

ibayama
質問者

補足

buff、sprintfを使うプログラムを作成したのですが、 teraterm上で 「0 b .」とずっと表示され続けてしまいます。 解決策お願いします。

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.1

マイコン全般に使える、汎用的な方法はありません。 開発環境によってはprintf()が勝手にUART出力されるようなものもありますが、基本的にはUART通信の部分も自分で書いて出力することになります。

関連するQ&A

  • C言語 タイマーのソースについて

    C言語でタイマーを使ってprintf文を記述することで 「1秒経過」、「2秒経過」、「3秒経過」のように表示させたいのですが、どのように表示させるのでしょうか? タイマーの間隔は、できれば1 [ms]だとうれしいてす。 回答お願いします

  • C言語を用いたマイコンと計測機器の通信

    現在,マイコン(Mbed)と測定機器間でUART通信を行い,測定機器の測定値をマイコンに取り込もうと,プログラムを作成しています。 測定器の説明書には STX 『DISP』 CR LF EOT (DISP以外は制御コード) の順にマイコンからデータを送れば測定値が返ってくると書いてありますが,C言語ではどのように記述すればよいでしょうか? ためしに printf('0x02'); printf('0x2c'); printf('0x44');.................. というように順番に送信してみましたが,測定値を取得できませんでした。 PCのVisual C++/CLIでソフトを作成し,測定器とPC間で通信したところ問題なく測定値を取得できました。 マイコンを使用して,外部機器と通信する場合,一般的にはどのようにコードを記述すればよいでしょうか? すごく初歩的な質問だと思いますが,なにとぞご教授宜しくお願い致します。

  • C言語によるプログラミング

    【問題】 三角形の底辺bと高さhを入力し、面積areaを計算して、次のように表示するプログラムを作りなさい。 底辺=> 10 高さ=> 5 面積 = 25 上記のような問題の解答は下記のようになるのですが、下記以外の解答方法はありませんでしょうか? 図々しいのは承知の上、C言語に詳しい方、解答の方よろしくお願いします! #include <stdio.h> main() { int b, h, area; printf ("底辺 => "); scanf ("%d",&b); printf ("高さ => "); scanf ("%d",&h); area = b * h / 2; printf ("面積 = %d\n",area); return (0); }

  • 経過時間を表示させたい(C言語)

    今以下のようなプログラムを作っています。問題の部分だけ載せておきます。  ・  ・  ・ a=0; b=0; time(&t1); for(○;△;□){ X番目の素数を表示させるアルゴリズム; time(&t2); b=t2-t1; if(a<b){ a=b; printf("%d秒経過...\n",a); }  ・  ・  ・ これですと経過時間は 1秒経過... 2秒経過... 3秒経過...  ・  ・  ・ と表示されるのですが、僕が目指しているのは、例えば、2秒経過したら「2秒経過...」という表示を「1秒経過...」を消してそのところに表示させたいのです。 つまり、まるで秒数の部分だけ変化しているように見せたいのです。 もし、やり方が分かる方がいましたら教えていただけると嬉しいです。ぜひともよろしくお願いします。

  • C言語のプログラミングについて教えてください

    課題で下記に示すのようなデータをファイル名を入力してのそのデータを読み込みyの最大値とそのときのxの値を表示するプログラムを作成しろと言われたのですが、僕はプログラミングが初心者でむしろ苦手でホント困ってます。だれか助けてください、お願いします! データ    x  y 0.12132 3.45355 0.12353  3.415451 . . . . . . のようにxとyの行列となっていて、その数は2000個を超えています。 自分なりにやってみたのですがデータをすべて読み込まないし、まずどのようにして、yの最大値をだし、なおかつそのxの値を表示させるのもわかんなくてホント困っています。 本末転倒になりますが、プログラムを書いていただけるとほんと助かります。よろしくお願いいたします。 ちなみにこれが自分で考えたプログラムです。とりあえず、yの値がでかいのでyの最大値だけだすつもりでやってみたけど駄目でした。 #include <stdio.h> #include <stdlib.h> int main(void) { FILE *fin; char *list[256]; char buf[1024]; char filename1[80]; printf("入力ファイル名"); gets(filename1); fin=fopen(filename1,"r"); if (fin ==NULL) { printf("%sをオープンできません\n",filename1); exit(1); } while (fgets(buf, 1024, fin) !=NULL) { printf("%s",buf); } static float max; int x; fscanf(fin,"%f",&x); if(x>max){ max=x; printf("yの最大値=%f\n",max); } fclose(fin); }

  • C言語について

    問題文が表示され、その解答を数字で入力すると正解の場合は「大正解」、不正解の場合は「はずれ」と表示されるプログラムなのですが、?部分がどうしても分りません・・・ 正しいと思えば0、間違ってると思うなら1と入力するプログラムです。 どなたかご教授いただけるとありがたいです>< main() { int i,k; i=0; while(i<5){ printf("次の文章が正しければ0、間違っていれば1を入力してください。\n"); printf("%s",q[i]); scanf("%d",&k); if(a[?]==?) {printf("大正解\n");} else {printf("はずれ\n");} i????; } printf("おしまい\n"); }

  •  現在、私はC言語を学んでいます。

     現在、私はC言語を学んでいます。  プログラミングの初期の初期の問題なんですが、 「Hello World」という有名なプログラムがありますよね? それについての質問です。 #include<stdio.h> main() { printf("Hello World"); return 0; } も #include<stdio.h> main(void) { printf("Hello World"); return 0; } も #include<stdio.h> int main() { printf("Hello World"); } もちゃんと表示できます。 ここで質問です。 int main(void) int main() main() main(void) はどう違うんですか? あと、 return 0; はあっても無くてもいいようなんですが どういう意味があるんでしょうか?

  • C言語について

    こんばんわ。協力お願いします。 2問あります。 1問目です。 西暦年yearを引数として受け取り, 閏年かどうかの判定結果を戻り値として返す関数leap_year()を作成せよ. ただし,leap_year()は,閏年の場合は1を返し, そうでない場合は0を戻り値として返すものとする. 提出するプログラムは,関数leap_year()だけでなく, メイン関数main()も含む下記プログラムを完成させる形で作成する。 #include <stdio.h> /* ここに関数leap_year()のプロトタイプ宣言を記述する */ int main() { int i, year[3]; for (i=0; i<3; i++) { printf("西暦年を入力してください"); scanf("%d", &year[i]); if (leap_year(year[i]) == 1) { printf("閏年です.\n"); } else { printf("閏年ではありません.\n"); } } } /* ここに関数leap_year()を定義する */ 2問目です。 mのn乗を計算する関数power()を作成せよ. ただし,関数power()はm,nを引数とし, 戻り値としてmのn乗の値を返すものとする. m,nは,正整数とする.プログラムには, 関数power()だけでなく,m,nを入力し, mのn乗を出力するメイン関数main()を含むものとする. main()は,power()の前に記述すること. また,power()のプロトタイプ宣言も記述すること。 よろしくお願いします。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語に関する質問

    初期位置を1mとして、ある物体の自由落下をシミュレートするプログラムを 「高さ=1-1/2×重力加速度×経過時間の二乗」 という考え方を 「初期位置を1m,落下速度を「重力加速度×1ループにかかる時間」とし, 高さを,「1ループ前の高さ」+「落下速度×1ループにかかる時間」」という考え方に変更して計算するようなプログラムにしたいのですが、どのように変えれば分かりません。(というか意味が分からないです) 何か公式などのヒントやソースコードより、どの部分をこのように変えれば良いという指摘があれば分かりやすく教えてください。 #include <windows.h> #include <mmsystem.h> #include <stdio.h> #include <conio.h> #pragma comment(lib, "winmm.lib") int main(void) { int command;//キーボード入力の文字判別用変数 int quit_flag = 1;//プログラム終了フラグ 0で停止 int c_flag = 0;//カウント状態取得用フラグ 1:カウント中,0:停止中 int h,m,s,ms;//左から,時間,分,秒,ミリ秒 double y=1; DWORD start; printf("使い方:小文字の's'でカウントスタート.カウント中,小文字の's'で停止.次の's'でまた0からスタート\n"); printf("使い方:どんな状態でも小文字の'r'でカウントリセットして停止\n"); printf("使い方:qでプログラム終了\n\n"); h=m=s=ms=0; while(quit_flag != 0)//quit_flagが0以外ならループ { while(!_kbhit())//何かキーが押されるまでループ { if(c_flag != 0)//c_flagが0以外であればカウント中ということ. { h=m=s=ms = timeGetTime() - start; y=1-(1.0/2.0)*(9.8/1000000)*ms*ms; printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } //printf("%02d:%02d:%02d:%03d\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000); if(c_flag==0){ printf("t=%d[ms],y=%f[m]\r",ms,y); //printf("t=%02d:%02d:%02d:%03d,y=%f[m]\r",h/3600000,(m/60000)%60,(s/1000)%60,ms%1000,y); } } command=_getch();//ループを抜けるために押されたキーの内容をcommandに代入. if(command=='s' && c_flag == 0) { printf("\n計測開始\n"); c_flag = 1; start = timeGetTime() ; h=m=s=ms=0; /* if(y==0){ printf("\n終了\n"); quit_flag = 0; } */ } else if(command=='s') { printf("\n計測中止\n"); c_flag = 0; } else if(command=='r') { printf("\nカウンタリセット,停止\n"); c_flag = 0; h=m=s=ms=0; } else if(command=='q') { printf("\n終了\n"); quit_flag = 0; } } return 0; }

専門家に質問してみよう