質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

Q&A

解決済

2回答

2019閲覧

8回で止まってしまいます

syo00

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Raspberry Pi

Raspberry Piは、ラズベリーパイ財団が開発した、名刺サイズのLinuxコンピュータです。 学校で基本的なコンピュータ科学の教育を促進することを意図しています。

0グッド

0クリップ

投稿2016/12/20 05:12

C

1コード 2``/* 3 * scanir.c 4 * 5 * copyright © 2016 Katsuhiko Miki All rights reserved. 6 */ 7 8#include <wiringPi.h> 9#include <stdio.h> 10#include <stdlib.h> 11#include <string.h> 12#include <signal.h> 13#include <sys/time.h> 14#include <lcd.h> 15 16int readable = 1; // 非同期でイベントが発生した場合、コールバックにより0に設定される 17int read_pin = 7; // 入力ピン番号(wiringpiの番号) 18int interval = 10; // 継続時間判定の間隔(us) 19int max_wait = 5000;// 最大継続時間(us) 20int hp = 100; //HP 21int cooltime; 22 23void signalCallBackHandler(int sig) 24{ 25 readable = 0; 26} 27 28double getMoment() 29{ 30 struct timeval tv; 31 gettimeofday(&tv, NULL); 32 return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec)); 33} 34 35int main(int argc, char *argv[]) 36{ 37 int result; 38 while(1){ 39 // スキャンデータを書きだすファイルのポインタを取得 40 FILE *fp; 41 char *fileName = "ir.data"; 42 if(argc >= 2){ fileName = argv[1]; } 43 if((fp = fopen(fileName, "w")) == NULL){ 44 printf("can't open file : %s\n", fileName); 45 exit(1); 46 } 47 printf("write file: %s\n", fileName); 48 49 50 // signal関数は、シグナル(非同期イベント)が発生したときに、 51 // そのシグナルを受信して、シグナル特有の処理を行うシグナル処理関数(シグナルハンドラ)を登録します。 52 if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){ 53 printf("can't set signal\n"); 54 exit(1); 55 } 56 57 // wiringpiのセットアップ 58 if(wiringPiSetup() == -1){ 59 printf("error wiringPi setup\n"); 60 exit(1); 61 } 62 63 // 読み取りピン番号 64 if(argc >= 3){ 65 read_pin = atoi(argv[2]); 66 } 67 pinMode(read_pin, INPUT); 68 printf("scaning pin: %d (wiringpi)\n", read_pin); 69 70 // 最大継続時間 71 if(argc >= 4){ 72 max_wait = atoi(argv[3]) * 1000; 73 } 74 printf("max keep time: %d(ms)\n", max_wait/1000); 75 76 // 準備完了 77 printf("Infrared LED scanning start.\n"); 78 printf("Pressed Ctrl+C, this program will exit.\n"); 79 80 // スキャン開始 81 result = scan(fp); 82 83 fclose(fp); 84 if(result || !readable){ 85 printf("\n\n!!! could not scanning. quit.\n\n"); 86 } else { 87 printf("\nScanning has been done.\n\n"); 88 } 89 90 if(hp == 0){break;} 91} 92 return 0; 93} 94 95int scan(FILE *fp) 96{ 97 // 受光モジュールは受光するとLOWになる 98 if(!digitalRead(read_pin)){ return 1; } 99 100 int on, off; 101 102 // 送信が開始されるまで待機 103 while( readable && digitalRead(read_pin) ){} 104 105 // 解析開始 106 while( readable ){ 107 on = getTime(0); 108 off = getTime(1); 109 fprintf(fp, "%6d %6d\n", on, off); 110 printf("%d\n",on); 111 //printf("%s\n", off); 112 113 114 115 lcddisplay(); 116 117 //最大継時間同じ状態が続いたら送信は終了していると判断 118 //if(off > max_wait){ break; } 119 120 } 121 122 123 124 return 0; 125} 126 127int getTime(int status) 128{ 129 int count = 0; 130 int max = max_wait / interval; 131 double start, end; 132 133 start = getMoment(); 134 while( digitalRead(read_pin) == status ) 135 { 136 delayMicroseconds(interval); 137 count++; 138 //最大継続時間同じ状態が続いたら送信は終了していると判断 139 if(count > max){ break; } 140 } 141 end = getMoment(); 142 143 return getInterval(start, end); 144} 145 146int getInterval(double t1, double t2) 147{ 148 return (int)(t2-t1); 149} 150 151 152 153int lcddisplay(int argc, char **argv) { 154 int fd; 155 int c; 156 int i; 157 158 if(wiringPiSetup() == -1) { 159 printf("Setup Fail\n"); 160 exit(1); 161 } 162 fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0); 163 164 lcdClear(fd); 165 lcdPuts(fd,"HP"); 166 lcdPosition(fd,0,1); 167 char sNum[100]; 168 hp -= 1; 169 sprintf(sNum,"%d",hp); 170 lcdPuts(fd,sNum); 171 172} 173 174 175 176 177赤外線通信を受け取り受け取ったタイミングでHPを減らしLCDディスプレイに表示させるという作業を行っているのですが8回目のHPのデクリメントを行うとどうしても止まってしまいます。 178何か解決策があれば教えてもらえないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

8回目のHPのデクリメントを行うとどうしても止まってしまいます

と言うのは、「Setup Fail」と画面表示して終了してしまうということでしょうか?

それならば、lcddisplay関数の中の

C

1if(wiringPiSetup() == -1) { 2 printf("Setup Fail\n"); 3 exit(1); 4}

の部分しか抜け出るところがないので、wiringPiSetup()関数の戻り値が-1になっているとしか思えません。
この関数の中身が示されていないので、これ以上は答えようがありません。それを示してもらえますか?もしくはこの関数の中身を自分で確認するかです。

それと、プログラムコードは```のブロックの中に書く必要があります。そうすればきれいに表示されます。

投稿2016/12/20 08:08

PineMatsu

総合スコア3579

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

推測ですが、lcdInitを表示の度に行っているからではないでしょうか。
通常この手のものは最初に一回行って、以降は得られたハンドルを使いまわすことになると思います。
また同様にfopenもループの度に行っていますが、これも初回に一回で良いと思います。
更にlcddisplay()には引数がありますが、呼出し側では指定していないですね。

投稿2016/12/20 05:57

ttyp03

総合スコア16996

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

syo00

2016/12/20 06:13

書き直してみたんですが今度は赤外線を受信すると一気に0まで行ってしまいます。。。
ttyp03

2016/12/20 06:42

どう書き直したかを書かないとなんとも言えませんが、おそらくscanの中で while( readable ){ このループから抜け出せないのでは? このループ必要でしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問