使用wiringPi进行分段错误

时间:2017-07-26 12:59:55

标签: c++ raspberry-pi segmentation-fault wiringpi

我对编码很新,每当按下连接到我的RasPi上的GPIO引脚的按钮时,我就会尝试写一些东西来写一个文本文档的占位符:

//Write date function//
void record() {

    ofstream myFile;
    myFile.open("report.txt");
    myFile << "Input at SPAM \n";
    myFile.close();

}

//myRead function//
void myRead(int i){

    if((digitalRead(4) == HIGH) && (i<5)) {
        record();
        digitalWrite(14, HIGH);
        delay(500);
        digitalWrite(14, LOW);  
        ++i;
        delay(500);
        myRead(i);
    }   
    else{
        if((digitalRead(4) != HIGH) && (i<5)){      
            myRead(i);
        }
    }

}   

int main() {
    wiringPiSetup();
    pinMode(12, OUTPUT);
    pinMode(14, OUTPUT);
    pinMode(4, INPUT);
    digitalWrite(12, HIGH);
    digitalWrite(14, LOW);

    myRead(1);
    digitalWrite(14, HIGH);
    delay(5000);
    digitalWrite(14, LOW);

    return 0;
}

代码编译没有任何投诉,但如果我在没有sudo命令的终端中运行它,我会收到“分段错误”错误。
当我使用sudo命令运行它时,程序启动,然后几乎立即结束。

供参考:

  • 针脚12为面包板上的分压器供电。
  • 引脚4应该从此分频器获取输入。
  • 只要针脚4上有输入,针脚14就会亮起LED。

每当我运行程序并非常快速地按下分压器上的按钮时,如果我按住按钮,LED将亮起。

如果没有它一旦启动就停止运行,我怎样才能让它正常运行?

1 个答案:

答案 0 :(得分:0)

我认为myRead存在几个可能的问题。

小改写可能是:

void myRead(int i)
{
    if((digitalRead(4) == HIGH) && (i<5)) {
        record();
        digitalWrite(14, HIGH);
        delay(500);
        digitalWrite(14, LOW);  
        ++i;
        delay(500);
        myRead(i);
    } else if((digitalRead(4) != HIGH) && (i<5)) {
        myRead(i);
    }
}

请注意,您有两次拨打digitalRead - 这可能会导致问题,因为第一个问题我返回的内容与HIGH不同,第二个可能会返回HIGH,这意味着两个条件都没有是真的。

您拨打myRead时,其替代分支中的i与原始呼叫相同。如果digitalRead多次返回与HIGH不同的内容,那么您的堆栈将非常快,并且您将获得段错误。

我会提出一个不同的版本,应该相同(禁止我的任何误解):

void myRead(int i)
{
    // as long as i is less than 5
    while (i < 5) {
        // busy wait for digitalRead(4) to be HIGH
        while (digitalRead(4) != HIGH);
        // do the main thing
        record();
        digitalWrite(14, HIGH);
        delay(500);
        digitalWrite(14, LOW);  
        ++i;
        delay(500);
    }
}

另请注意,这只是简单的C,而不是C ++(从技术上讲,它是有效的C ++,但它没有使用C ++)