Ошибка сегментации с проводкой Pi

Я довольно новичок в кодировании, и я пытался написать что-то, чтобы записать заполнитель в текстовый документ всякий раз, когда нажимается кнопка, прикрепленная к выводу 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 команда, программа запускается, а затем заканчивается почти сразу.

Для справки:

  • Вывод 12 обеспечивает питание потенциального делителя на макете.
  • Вывод 4 должен принимать вход от этого делителя.
  • Вывод 14 вызывает включение светодиода при наличии входа на выводе 4.

Всякий раз, когда я запускаю программу и ОЧЕНЬ БЫСТРО нажимаю кнопку на потенциальном делителе, светодиод будет гореть, если я буду удерживать кнопку.

Как я могу заставить это работать должным образом без остановки, как только она начинается?

-1

Решение

Я думаю, что есть несколько возможных проблем с 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 ++)

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]