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

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

ただいまの
回答率

90.51%

  • C

    4297questions

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

  • Raspberry Pi

    1019questions

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

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

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 676

syo00

score 2

`C コード /*

  • scanir.c
    • copyright © 2016 Katsuhiko Miki All rights reserved.
      */

include <wiringPi.h>

include <stdio.h>

include <stdlib.h>

include <string.h>

include <signal.h>

include <sys/time.h>

include <lcd.h>

int readable = 1;       // 非同期でイベントが発生した場合、コールバックにより0に設定される
int read_pin = 7;       // 入力ピン番号(wiringpiの番号)
int interval = 10;      // 継続時間判定の間隔(us)
int max_wait = 5000;// 最大継続時間(us)
int hp = 100; //HP
int cooltime;

void signalCallBackHandler(int sig)
{
readable = 0;
}

double getMoment()
{
struct timeval tv;
gettimeofday(&tv, NULL);
return ((double)(tv.tv_sec) * 1000000 + (double)(tv.tv_usec));
}

int main(int argc, char *argv[])
{
int result;
while(1){
// スキャンデータを書きだすファイルのポインタを取得
FILE *fp;
char *fileName = "ir.data";
if(argc >= 2){ fileName = argv[1]; }
if((fp = fopen(fileName, "w")) == NULL){
printf("can't open file : %s\n", fileName);
exit(1);
}
printf("write file: %s\n", fileName);

// signal関数は、シグナル(非同期イベント)が発生したときに、
// そのシグナルを受信して、シグナル特有の処理を行うシグナル処理関数(シグナルハンドラ)を登録します。
if(signal(SIGINT, signalCallBackHandler) == SIG_ERR){
printf("can't set signal\n");
exit(1);
}

// wiringpiのセットアップ
if(wiringPiSetup() == -1){
printf("error wiringPi setup\n");
exit(1);
}

// 読み取りピン番号
if(argc >= 3){
read_pin = atoi(argv[2]);
}
pinMode(read_pin, INPUT);
printf("scaning pin: %d (wiringpi)\n", read_pin);

// 最大継続時間
if(argc >= 4){
max_wait = atoi(argv[3]) * 1000;
}
printf("max keep time: %d(ms)\n", max_wait/1000);

// 準備完了
printf("Infrared LED scanning start.\n");
printf("Pressed Ctrl+C, this program will exit.\n");

// スキャン開始
result = scan(fp);

fclose(fp);
if(result || !readable){
printf("\n\n!!! could not scanning. quit.\n\n");
} else {
printf("\nScanning has been done.\n\n");
}

if(hp == 0){break;}
}
return 0;
}

int scan(FILE *fp)
{
// 受光モジュールは受光するとLOWになる
if(!digitalRead(read_pin)){ return 1; }

int on, off;

// 送信が開始されるまで待機
while( readable && digitalRead(read_pin) ){}

// 解析開始
while( readable ){
on = getTime(0);
off = getTime(1);
fprintf(fp, "%6d %6d\n", on, off);
printf("%d\n",on);
//printf("%s\n", off);

lcddisplay();

//最大継時間同じ状態が続いたら送信は終了していると判断
//if(off > max_wait){ break; }

}

return 0;
}

int getTime(int status)
{
int count = 0;
int max = max_wait / interval;
double start, end;

start = getMoment();
while( digitalRead(read_pin) == status )
{
delayMicroseconds(interval);
count++;
//最大継続時間同じ状態が続いたら送信は終了していると判断
if(count > max){ break; }
}
end = getMoment();

return getInterval(start, end);
}

int getInterval(double t1, double t2)
{
return (int)(t2-t1);
}

int lcddisplay(int argc, char **argv) {
int fd;
int c;
int i;

if(wiringPiSetup() == -1) {
printf("Setup Fail\n");
exit(1);
}
fd = lcdInit(2,16,4,4,5,0,1,2,3,0,0,0,0);

lcdClear(fd);
lcdPuts(fd,"HP");
lcdPosition(fd,0,1);
char sNum[100];
hp -= 1;
sprintf(sNum,"%d",hp);
lcdPuts(fd,sNum);

}

赤外線通信を受け取り受け取ったタイミングでHPを減らしLCDディスプレイに表示させるという作業を行っているのですが8回目のHPのデクリメントを行うとどうしても止まってしまいます。
何か解決策があれば教えてもらえないでしょうか。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

checkベストアンサー

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/12/20 15:13

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

    キャンセル

  • 2016/12/20 15:42

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

    キャンセル

0

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

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

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

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


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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • C

    4297questions

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

  • Raspberry Pi

    1019questions

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