我对编码很新,每当按下连接到我的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
命令运行它时,程序启动,然后几乎立即结束。
供参考:
每当我运行程序并非常快速地按下分压器上的按钮时,如果我按住按钮,LED将亮起。
如果没有它一旦启动就停止运行,我怎样才能让它正常运行?
答案 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 ++)