Я пишу C ++ библиотеку программ для моего Arduino. Библиотека для DTMF-декодера. У меня проблема с добавлением двух обнаруженных и проверенных тонов вместе, чтобы вернуть соответствующую кнопку.
Я вызываю функцию ниже дважды (она не полностью закончена, но, надеюсь, вы поймете мою логику). Если я инициализирую значения R1 & R2 до 0, то они перезаписывают друг друга при втором вызове. Если я их вообще не инициализирую, я получаю ошибку проверки во время выполнения.
Я потратил на 40+ часов, пытаясь выяснить это (я очень простой кодер!). Любая помощь будет принята с благодарностью!
int DTMF::validate(void)
{
int threshhold = 9000;
int i;
int x;
int y;
// int high[7];
for(i=0; i<7; i++)
{
if(magnitude[i] > threshhold)
{
return(i);
}
}
}
unsigned char DTMF::buttonPressed(void)
{
int validatedFreq = validate();
cout << "valid is returning: " << validatedFreq << endl;
int R1;
int R2;
switch(validatedFreq)
{
case 0:
R1=1;
cout << "DEBUG:This is case 1 R1 output: " << R1 << endl;
break;
case 1:
R1=2;
break;
case 2:
R1=3;
break;
case 3:
R2=4;
cout << "DEBUG:This is case 3 R2 output: " << R2 << endl;
break;
case 4:
R2=5;
break;
case 5:
R2=6;
break;
case 6:
R2=7;
break;
}
if(R1==1 && R2==4)
{
cout << "DEBUG:The value of R1 is " << R1 << " and the value of R2 is " << R2 << endl;
return(button[0]);
}
}
R1 и R2 являются локальные переменные, так как вы объявили их внутри функции. Это означает, что они инициализируются каждый раз, когда вы вызываете функцию, и каждый раз, когда вы это делаете, R1 и R2 — две новые переменные типа int.
Если вы хотите, чтобы их значения оставались неизменными между различными вызовами функции, вы можете объявить их как static
, Это позволяет инициализировать их только один раз при каждом запуске программы. Вы делаете это с
static int R2;
R1 и R2 являются локальными и автоматически для функции DTMF :: buttonPressed, поэтому они не сохраняются между вызовами.
Если вы не инициализируете их, вы должны назначить их, прежде чем предположить, что они имеют какое-либо значимое значение. Но ваш переключатель назначить только один из них. Но позже вы притворяетесь использовать их обоих в следующем if
,
Какое бы поведение вы не наблюдали в этот момент, оно не определено.
Вы должны изменить R1
а также R2
в класс DTMF
члены (переместите их в заголовок). Затем вы должны инициализировать их до нуля в конструкторе и проверить, если и то и другое ненулевые раньше if(R1==1 && R2==4)
, Как это:
// header:
class DTMF {
...
int R1;
int R2;
}
// cpp
DTMF::DTMF() : R1( 0 ), R2( 0 ) { ... }
unsigned char DTMF::buttonPressed(void)
{
int validatedFreq = validate();
cout << "valid is returning: " << validatedFreq << endl;
//int R1;
//int R2;
// fill R1 or R2 exactly as you did
if ( R1 != 0 && R2 != 0 && R1==1 && R2==4 ) {
...
R1 = R2 = 0;
}