C++プログラムで通信データが変化しない理由と解決方法

このQ&Aのポイント
  • C++のプログラムにおいて、readfile関数を使用してPICからPCへデータを送信する際に、通信開始してからPICからのデータを変化させても受信データが変化しない現象が発生します。
  • 問題の解決方法としては、以下の点を確認してみてください。1つ目は、通信設定の正確性を確認してください。2つ目は、通信速度やボーレートに関する設定を再確認し、適切な値に設定してください。3つ目は、データの受信方法に問題がないかを確認してください。
  • これらの確認を行うことで、通信データが正しく受信されるようになる可能性があります。しかし、すべての問題を解決できるわけではないため、他の原因も考慮する必要があります。
回答を見る
  • ベストアンサー

C++のプログラムについて

readfile関数を使用してPICからPCへデータを送信しようとしているのですけれど、 通信開始してからPICからのデータを変化させても受信データが変化しません。 なぜでしょうか。解決方法もおしえてください。 ちなみにPICの信号がちゃんと変わっているかはcheck済みです。 PC側プログラム if(key=='G'){ ReadFile( comHandle, &data_a, 1, &lRead, NULL ); printf("%c\n",data_a); } キーボードで'G'を入力すると受信するようにしてあり PIC側では最初'A'を出力していて、 'G'を押すとprintfで'A'を表示しますが、PIC側の信号を'B'に変化させて 'G'を押しても'B'と表示されずに'A'と表示されてしまいます。

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

掲示のコードだけではなんとも言えませんが……。 >PIC側では最初'A'を出力していて、 出力「し続けて」いるんですか? 単発で'A'を出力しているんですか? 出力し続けているのであれば…… >ReadFile(comHandle,&data_a,1,&lRead,NULL); は、「PCの受信バッファから1文字読み込み」しているだけなので 【'A'が受信バッファに溜まっているから】 >PIC側の信号を'B'に変化させて >'G'を押しても'B'と表示されずに'A'と表示されてしまいます。 なのではないですか? なお…PC側の受信バッファがいっぱいになった後で受信したデータがどうなるのか…は、通信の仕様による…かと。 # ハードウェアフロー制御していて送信を止めているのか、バッファに入らないデータは捨てているのか……

その他の回答 (4)

noname#164673
noname#164673
回答No.5

あくまでも想像です。ご注意下さい。 PICから、Aを連続して出力していませんか? もしそうだとすると、PC側の受信バッファに連続したAが格納されています。 プログラムでは、Gが押下された時に1文字しかでデータを読み取りません。 残りは、バッファの中です。 バッファをクリアしない状態で、信号がBに変わったとしても、バッファの最後にBが追加されるので、いくらGを押下したとしてもバッファ内の全てのAが読み出されるまでは、Bは取得できません。 解決策は、全てのデータをReadFileで読み込み、最後の1文字を採用する事です。 バッファにある最後の1文字が最新のPIC送信データだからです。 全てのデータを読み込むとは、ループなどで何度も繰り返しReadFileを利用して、もうバッファからデータが読み出せなくなるまで読み込むと言う事です。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.4

それと、ReadFile関数の戻り値が「0」の時はエラーなんだけど、このエラーには2種類ある。 1つは「タイムアウトした」など、続けてReadFile関数を呼び出して良い場合。 1つは「相手側からポートが閉じられたため、ハンドルは既にクローズされている」など、それ以上ReadFile関数を呼び出してはいけない場合。 この辺りもちゃんとチェックしないと「読めてないのに、読んだつもりになって、前の状態を表示し続ける」って事になります。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.3

あと、ReadFile関数の戻り値が「0以外」かどうかもチェックしないといけない。 ReadFile関数の戻り値が「0」の時は、エラーで帰って来てるから、データは読み込まれない。データが読み込まれないなら、変数の値は変化しないから、何度'G'キーを押しても、'A'しか表示されない。

  • chie65535
  • ベストアンサー率43% (8519/19367)
回答No.2

ReadFile関数を呼び出したあと、関数から帰って来たら、読み込めたバイト数を表示してみよう。 たぶん「読み込めたバイト数」が「0」になってると思う。 >ちなみにPICの信号がちゃんと変わっているかはcheck済みです。 PICのデータバスの信号が変化してても、制御信号が上手く変化して無かったら「データは来てない」って事になるので、PCは「データが無かった」って言って、読み込めたバイト数が「0」で返って来る。 読み込めたバイト数が0なら、読み込み用の変数は変化しないから、何度Gキーを押しても、最初に読まれた'A'しか表示しません。

関連するQ&A

  • PIC-PCシリアル通信プログラム

    PICとPCでRS232のシリアル通信を行おうとしているんですけれど、 PICからPCに文字列を送ろうと たとえば PIC側からプログラムで puts("A\0");とデータを送信して ReadFile()関数でPC側で受信しているんですけれど、 受信したデータを画面表示されると Aフフフフフフフフフフフフフフフフフフフフフフフフと表示されてしまいます。 ちなみに送信データをNULLだけにしても フフフフフフフフフフフフフフフフフフフフフフフフフを表示されます。 これを解決する方法がわかりません。 どなたか教えてください。

  • cプログラム

    #include<stdio.h> /*Calc MAX of (a,b)*/ int max(int x,int y) { if(x>y) return x; else return y; } /*Calc n!*/ void fact(int n) { int i,ans; ans=1; for(i=n;i>=1;i--){ ans*=i; } printf("ans=%d\n",ans); } /*END*/ void end() { printf("Thanks\n"); exit(0); } /*Main*/ int main() { int key; int a,b,saidai; int n; while(1){ puts("\n=====Main MENU ====="); puts("1.......max(a,b)"); puts("2.......n!"); puts("9.......END\n"); printf("Input No(1,2,9)=?"); scanf("%d",&key); switch(key){ case 1: printf("Inputs:a,b?"); scanf("%d,%d",&a,&b); saidai=max(a,b); //Call max(a,b) printf("max(%d,%d)=%d\n",a,b,saidai); break; case 2: printf("Input:n?"); scanf("%d",&n); fact(n); break; case 9: end(); break; default: printf("!!!!!Miss Input_No!!!!!\n"); break; } } のプログラムなのですが、1の処理を行った場合max(a,b)の値が正しく表示されません どこを直せばいいでしょうか? return(0);

  • C言語

    main() { int a = 5,b=2,e,f,g=3,i; double c,d,h=2.0; c = a/b; printf("c = %f\n",c); d = a/h; printf("d=%f\n",d); e = a++; f = ++b; g+= 4; i= ++a + b; printf(" a = %d\n",a); printf(" b = %d\n"b); printf(" e = %d\n"e); printf(" f = %d\n"f); printf(" g = %d\n"g); printf(" i = %d\n" i); 答え a=7,b=3,c=2.0,d=2.5,e=5,f=3,g=7,i=10 この問題のa,b,iがどうやってこの値になるのかがわかりません解説お願いします。

  • C言語のプログラムの流れについて

    下に貼り付けたプログラムの流れを順番に教えて頂きたいです。 特にadd関数とinsert関数の中身の動きについてが分からないので教えていただきたいです。 (a,b,c,sentouなどの動きなど。) 参考にですが リスト構造を用いて、read関数で読み込んだ単語をアルファベット順にソートしてリストのセルに入れ、同じ単語はまとめてその単語と個数を順に表示するプログラムです。 1からの説明を要求して申し訳ありませんがよろしくお願いいたします。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<ctype.h> typedef struct moji{ char w[50]; int cnt; struct moji *next; }moji; int main(){ FILE *fp; char data[50]; moji *sentou; moji *p=NULL; if((sentou=(moji *)malloc(sizeof(moji)))==NULL){ printf("malloc error\n"); exit(1); } fp=fopen("tango.txt","r"); if((fp = fopen("tango.txt","r"))==NULL){ printf("can't open\n"); exit(1); } while(read(data,fp)){ add(data,sentou); } p=sentou->next; while(p != NULL){ printf("%s %d\n",p->w,p->cnt); free(p); p=p->next; } fclose(fp); return (0); } int read(char data[],FILE *fp){ /*1つの単語(連続したアルファベット)をdataに格納して、スペースで区切られたらそこで格納をやめ、値1を返す。再度単語を格納するときはdataを初期化し、再度1つの単語を取得する。ファイルの単語がなくなれば(EOFなら)0を返す関数read()*/ } void add(char data[],moji *sentou){ moji *a,*c; for(c=sentou;c!=NULL;c=c->next){ if(strcmp(c->w,data)==0){ c->cnt++; return; } if(strcmp(c->w,data)>0){ break; } else{ a=c; } } insert(a,c,data); } void insert(moji *a,moji *c,char data[]){ moji *b; if((b=(moji *)malloc(sizeof(moji)))==NULL){ printf("malloc error\n"); exit(1); } strcpy(b->w,data); b->cnt=1; a->next=b; b->next=c; }

  • RS232C通信について

    PC-マイコン間の通信において マイコンから信号を受信するために ReadFile関数の第3引数を受信文字バイト数にしたところ, PC側のプログラムでReadFile関数を実行するごとに 受信文字が1バイトずつ右にずれるような受信をし始めました. 1ループ→"abcd" 2ループ→"dabc" 3ループ→"cdab" こちら側の意図としては ReadFile関数を一度実行すると, ReadFile関数の第2引数に上書きされるものだと思っていたのですが, 具体的にはどのように文字が格納されていくのでしょうか? また,あわせてWriteFile関数で文字列をマイコンに送信しているのですが, 上述の文字列と合体した状態で受信してしまいます. 具体的には char c[17]="abcdefghijklmnop"; char p[13]="100100100100"; ハンドルの指定 ループ始め ・・・ ReadFile (hCom, c, strlen(c), &dwRead, NULL); WriteFile (hCom, p, strlen(p), &wbyte, NULL); ・・・ ループ終わり ハンドルクローズ と記述しています. 仮にマイコン側から"abcdefghijklmnop"が送られてきた場合 cには 1ループ→"100100100100abcd" 2ループ→"100100100100pabc" です. どこに課題があるでしょうか よろしくお願いします.

  • このC言語プログラムでどこをいじればいいのか教えて下さい。

    このC言語プログラムでどこをいじればいいのか教えて下さい。 //2 つの整数を入力し、和、差、積、商を計算し表示する。 #include<stdio.h> int main(void) { int a,b,wa,sa,seki,syou; scanf("%d %d",&a,&b); wa=a+b; sa=a-b; seki=a*b; syou=a/b; printf("%d+%d=%d\n",a,b,wa); printf("%d-%d=%d\n",a,b,sa); printf("%d*%d=%d\n",a,b,seki); printf("%d/%d=%d\n",a,b,syou); return (0); } これを繰り返し実行する形にしたいです。できれば今勉強中のwhileでお願いします。 また間違っている部分、指摘などありましたら宜しくお願いします。 大きな値をいれると足し算がダメになったり、割り算がおかしくなります。 また実数の時はどうなのかなど教えて下さい。

  • C言語のプログラム組んだのですが完成させてください

    C言語のプログラムを断片的に作成したのでつなげて完成させて頂けないでしょうか? このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。 http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; int main(void) { int a; do { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } while(a<1 || a>4); return a; } /*read_file関数の宣言*/ int read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } return 0; } /*p_all関数の宣言*/ int p_all(void) { int i; printf("名前 身長(cm) 体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } 最初の処理番号を入力した所で終わってしまいます、何とか改変してくださいお願いします 補足

  • c言語のプログラムについて

    今年からC言語を始めた大学1年生です。レポートで四則計算を行うプログラムを6/19までに作らないといけないです。使えるのは今までに習った選択型、反復型、関数scanfです。このプログラムの留意点は次の4つです。 1.使う演算を選択してもらう   例えば   どんな演算をしますか? 1:+,2:-,3:*,4:/ (選択) 2.演算を行う数値を入力してもらう   例えば   a + b の計算をします。aを入力してください。 3.演算結果を表示する   ○+○の答えは ○です 4.計算終了か、それともほかの演算を行うか 決める   0:計算終了 1:他の計算を行う を選択してください  以下のプログラムはこのことを留意してプログラムをつくりました。どこがおかしいのでしょうか。 #include<stdio.h> main() { short a,b,m,n; long c,d,e,f; c = a + b; d = a - b; e = a * b; f = a / b; m = 1; printf("整数を入力してください:"); scanf("%d",&a); printf("どんな演算をしますか?:"); printf("1: +,2: -,3: ×,4: ÷ :"); scanf("%d",&n); while(m=1){ if(n<=4){ while(m=1){ switch (n<=4){ case 1: printf("整数を入力してください:"); scanf("%d",&b); printf("%d + %d = %d \n",a,b,c); break; case 2: printf("整数を入力してください:"); scanf("%d",&b); printf("%d - %d = %d \n",a,b,d); break; case 3: printf("整数を入力してください:"); scanf("%d",&b); printf("%d × %d = %d \n",a,b,e); break; case 4: printf("整数を入力してください:"); scanf("%d",&b); printf("%d ÷ %d = %d \n",a,b,f); break; } } } else { printf("計算できません。"); printf("演算をやり直してください。\n:"); } } printf("計算を終了しますか、それとも他の計算を行いますか?:"); printf("0:計算終了,1:他の計算を行う:"); scanf("%d",&m); printf("計算を終了します。\n"); } 提出期限があるのでなるべく早めのご回答待ってます。生意気言ってすいません。

  • このCのプログラムの修正と追加してくれませんか

    完成まで近いのですが、詰まっております このサイトでコンパイルなど出来ます http://ideone.com/ 以下の問題を解きました また問題文の指示には必ずしたがってください。また、この文章の条件でなく、人数が4人とかそれ以外の時でも出来るようなプログラムでお願いします。実行結果のとおりになるようお願いします http://i.imgur.com/nuzJv2v.png http://i.imgur.com/c7f3Vh2.png http://i.imgur.com/5aCqDO0.png http://i.imgur.com/9u8hHIM.png 問題は画像になっています、実行結果も含まれています #include<stdio.h> #include<string.h> /*構造体型struct Dataの宣言*/ struct Data{ char name[20]; int height; double weight; } data[100]; int cnt; int main(void) { int a; while(1) { printf("**************身長・体重の表示***************\n\n"); printf(" データファイルの読み込み・・・・・(1)\n"); printf(" 全てのデータを表示・・・・・・・・(2)\n"); printf(" 特定のデータを表示・・・・・・・・(3)\n"); printf(" 終わり・・・・・・・・・・・・・・(4)\n\n"); printf("処理番号を入力してください\n"); scanf("%d",&a); } if (a==1){ read_file(); } if (a==2){ p_all(); } if (a==3){} if(a==4){ break; } return a; } /*read_file関数の宣言*/ void read_file(void) { FILE *fp; char filename[20]; cnt=0; printf("読み込むファイルの名前を入力してください。\n"); scanf("%s",filename); fp=fopen(filename,"r"); if(fp==NULL){ printf("ファイルをオープンできませんでした。\n"); return 1; } while(fscanf(fp,"%c %d %lf",data[cnt].name,data[cnt].height,data[cnt].weight)!=EOF){ cnt++; fclose(fp); printf("ファイルを読み込みました。\n"); } return 0; } /*p_all関数の宣言*/ void p_all(void) { int i; printf("名前 身長(cm) 体重(kg)\n"); for(i=0;i<cnt;i++) { printf("%-2s %5d %.2f\n",data[i].name,data[i].height,data[i].weight); } } int main(void) { }

  • ガウスの掃き出し法によるC++プログラム

    大学で、ガウスーヨルダンの掃き出し法により連立方程式を解き、係数マトリクスの逆行列と解を表示するプログラムを作れ、という課題が出ました。 4s+t+3u+2v=23 s+4t+3u+3v=30 5s+5t+10u+5v=65 4s+4t+2u+6v=42 という問題です。 まったく素人の状態から4時間ほどやったくらいでこの問題が出たので、解き方が全くわからなかったのですが、いろいろなサイトを巡ってこのようなプログラムを作りました。 #include <stdio.h> #include <float.h> #define N 4 /* 行列の行数および列数 */ double A[N][N] = { { 4.0,1.0,3.0,2.0}, /* 係数行列 A の定義 */ {1.0,4.0,3.0,3.0}, {5.0,5.0,10.0,5.0}, {4.0,4.0,2.0,6.0}}; double b[N] = {23.0,30.0,65.0,42.0}; /* 定数ベクトル b の定義 */ void Gauss_J( int, double*, double* ); void main( void ) { int i; /* カウンタ */ printf( "%d元連立一次方程式\n", N ); for( i = 0; i < N ; i++ ) { printf( "%g s + %g t + %g u + %g v = %g \n", A[i][0], A[i][1], A[i][2],A[i][3], b[i] ); } printf("の解は,\n" ); Gauss_J( N, (double *)A, (double *)b ); /* ガウス・ジョルダン法で解く */ printf( "s = %g \n", b[0] ); printf( "t = %g \n", b[1] ); printf( "u = %g \n", b[2] ); printf( "v = %g \n", b[3] ); } void Gauss_J( int n, double *a, double *b ) { int p, i, j, l ; /* カウンタ */ double pivot, c ; /* ピボット値 */ for ( p = 0 ; p < n ; p++ ) /* 1行目から n行目まで繰り返す */ { pivot = a[ p*n + p ]; /* ピボットを取得する */ for ( i = p ; i < n ; i++ ) /* p行目の p列目から n列目まで */ { a[ p*n + i ] /= pivot; /* 係数行列の p行を pivotで割る */ } b[ p ] /= pivot; /* 定数ベクトルの p行を pivotで割る */ for ( l = 0 ; l < n ; l++ ) /* 1行目から n行目まで */ { if ( l != p ) /* p行を除いて */ { c = a[ l*n + p ]; /* 掃き出す */ for ( j = p ; j < n ; j++ ) { a[ l*n + j ] -= c * a[ p*n + j ]; } b[ l ] -= c * b[ p ]; } } } return ; } これで行列の解は出るようになったのですが、逆行列が表示されてません。 どうすれば表示されるようになるのでしょうか?

専門家に質問してみよう