Я довольно новичок в кодировании, и я пытался написать что-то, чтобы записать заполнитель в текстовый документ всякий раз, когда нажимается кнопка, прикрепленная к выводу GPIO на моем RasPi:
//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
команда, программа запускается, а затем заканчивается почти сразу.
Для справки:
Всякий раз, когда я запускаю программу и ОЧЕНЬ БЫСТРО нажимаю кнопку на потенциальном делителе, светодиод будет гореть, если я буду удерживать кнопку.
Как я могу заставить это работать должным образом без остановки, как только она начинается?
Я думаю, что есть несколько возможных проблем с 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 ++)
Других решений пока нет …