Fout in arduino code, waar gaat het mis?

Pagina: 1
Acties:

Onderwerpen

Vraag


Acties:
  • 0 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
void loop() 
{
  int Code = 0;
  char user_input_pass[4];
  Serial.println("Please Enter Your Current Password");
  while (Code < 4){
      char Key = customKeypad.getKey();
      if (Key) {
        user_input_pass[Code++] = Key;
        Serial.print(Key); // debug
      }
        // else
  }
  
  if (Code == 4){
    Serial.println("De code is");
    Serial.print(user_input_pass); // Geeft 2502 in console
    
      if (user_input_pass == "2502") {
          // werkt niet
       } 
      if (user_input_pass == 2502) { 
          // werkt ook niet
       }        
   }
}


Ik ben middels een Arduino een keypad aan het programmeren. De bedoeling is dat ik een 4 cijferige code invoer, en als de juiste code is ingevoerd deze een bepaalde actie uitvoert.

Ik krijg het echter niet voor elkaar en zit er al een uur naar te kijken.

Ik denk dat het iets met chars en int(egers) te maken heeft, maar ik krijg het maar niet werkend.

Met wat probeersels krijg ik het volgende wel 'werkend':

code:
1
2
3
4
5
6
7
8
    Serial.println("De code is");
    Serial.print(user_input_pass); // Geeft 2502 in console

    String myString = String(user_input_pass);
  
    if (myString == "2502") { 
          Serial.println("code geaccepteerd");
    }


Welke in de console dan 'code geaccepteerd' weergeeft. Dus ik denk, dat is um. Maar zodra ik er extra code bij zet krijg ik geen foutmeldingen, maar de 'code geaccepteerd' en de opvolgende code wordt vervolgens niet meer uitgevoerd of weergegeven in de console. Er komen dan een paar rare tekens bij in de console, maar dat kan ik ook niet verklaren.
De code is
2502⸮c⸮
987654321X00٬⸮`Please Enter Your Current Password
Er gaat dus ergens iets mis, maar ik kan er niet de vinger op krijgen.

Wat assistentie in het, waarschijnlijke simpele, probleem zou fijn zijn.

[ Voor 6% gewijzigd door BLACKfm op 22-02-2023 00:12 ]

Litebit.eu voorraad check :).

Alle reacties


Acties:
  • +1 Henk 'm!

  • _eLMo_
  • Registratie: Juni 1999
  • Niet online

_eLMo_

Formerly: marowi

Lijkt erop dat je null terminated strings moet gebruiken. Je reserveert nu een array van 4. Daarna print je die. Maar hoe moet de print functie weten waar te stoppen? Die stopt bij \0. Ik durf te wedden dat als je je array 5 lang maakt, en een 0 op index 4 zet de print in ieder geval al geen rare dingen gaat printen.

En je wil dit doen:

code:
1
if (strcmp(user_input_pass,"2502")==0)


Gezien je een char array gebruikt ipv een string.

[ Voor 17% gewijzigd door _eLMo_ op 22-02-2023 00:34 ]

SFPC - Motorrijder - EV - PV - L/L WP - Steun de TET!


Acties:
  • +1 Henk 'm!

  • fopjurist
  • Registratie: Mei 2021
  • Niet online

fopjurist

mr.drs. fopjurist

Wat marowi zegt. Als je \0 toevoegt kun je ook strcmp(user_input_pass, "2502") == 0 gebruiken.
je krijgt geen melding als iemand zijn post wijzigt :'(

[ Voor 25% gewijzigd door fopjurist op 22-02-2023 00:37 ]

Beschermheer van het consumentenrecht


Acties:
  • 0 Henk 'm!

  • _eLMo_
  • Registratie: Juni 1999
  • Niet online

_eLMo_

Formerly: marowi

fopjurist schreef op woensdag 22 februari 2023 @ 00:36:
Wat marowi zegt. Als je \0 toevoegt kun je ook strcmp(user_input_pass, "2502") == 0 gebruiken.
je krijgt geen melding als iemand zijn post wijzigt :'(
Het was laat (en ik ben een serial-editer hahaha) :>

SFPC - Motorrijder - EV - PV - L/L WP - Steun de TET!


Acties:
  • 0 Henk 'm!

  • ErnstvV
  • Registratie: Februari 2023
  • Niet online
_eLMo_ schreef op woensdag 22 februari 2023 @ 00:32:
Lijkt erop dat je null terminated strings moet gebruiken. Je reserveert nu een array van 4. Daarna print je die. Maar hoe moet de print functie weten waar te stoppen? Die stopt bij \0. Ik durf te wedden dat als je je array 5 lang maakt, en een 0 op index 4 zet de print in ieder geval al geen rare dingen gaat printen.

En je wil dit doen:

code:
1
if (strcmp(user_input_pass,"2502")==0)


Gezien je een char array gebruikt ipv een string.
Even wat achtergrond, in C is een string een pointer naar een stuk geheugen waar bytes in staan. Als je dan '==' gebruikt in je vergelijking met de verwachte string, denk de compiler dat je wilt testen of de pointers hetzelfde zijn. En dat is natuurlijk niet zo.

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16
ErnstvV schreef op woensdag 22 februari 2023 @ 15:06:
[...]

Even wat achtergrond, in C is een string een pointer naar een stuk geheugen waar bytes in staan. Als je dan '==' gebruikt in je vergelijking met de verwachte string, denk de compiler dat je wilt testen of de pointers hetzelfde zijn. En dat is natuurlijk niet zo.
Is dat dan ook de reden waarom het (in mijn geval) niet werkt op die manier?

Als ik:

code:
1
if (strcmp(user_input_pass,"2502")==0)


Doe dan werkt het niet, maar met:

code:
1
if (strcmp(user_input_pass,"2502"))


Dan werkt het wel, maar worden alle onderliggende stappen uitgevoerd. Dus het maakt niet uit wat voor 4-cijferige code ik invoer.
Daar kwam ik achter toen ik meerdere codes wou toevoegen.

code:
1
if (strcmp(user_input_pass,"8888"))


Gaat vervolgens beide IF statements af, terwijl ik zou verwachten dat ze het beide niet moeten doen, of in het geval van de specifieke code in ieder geval alleen de corresponderende variant...


De huidige code:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void loop() 
{
  int Code = 0;
  char user_input_pass[4];
  Serial.println("Toets 4 cijfers in");
  while (Code < 4){
      char Key = customKeypad.getKey();
      if (Key) {
        user_input_pass[Code++] = Key;
        Serial.print(Key); // debug
      }
        // else
  }
  
  if (Code == 4){ // indien 4 toetsen zijn ingedrukt gaan we hier mee verder
    Serial.println("De code is");
    Serial.print(user_input_pass); // Geeft 2502 of 3344 in console
    Serial.println("\n\n");
    
      if (strcmp(user_input_pass, "2502")) {
          Serial.println("Code 2502 geaccepteerd");
       } 
      if (strcmp(user_input_pass, "3344")) { 
          Serial.println("Code 3344 geaccepteerd");
       }
     // etc.        
   }
}


Misschien dat dit ook beter met een Switch en Case, dan een IF/Else te doen is. Maar dat heb ik nog niet geprobeerd.

Het internet verteld mij echter dat de 'Switch (var)' waarde dan een integer moet zijn, en dat is de var 'user_input_pass' in dit geval blijkbaar niet.

Litebit.eu voorraad check :).


  • hcQd
  • Registratie: September 2009
  • Nu online
Strings in C worden afgesloten met een \0, voor een wachtwoord van vier tekens heb je een buffet nodig van 5 tekens, en je moet ervoor zorgen dat de laatste een \0 is.

Bijvoorbeeld:
code:
1
char user_input_pass[5] = { 0 };


Of je moet strncmp gebruiken, maar dat raad ik niet aan.

  • ErnstvV
  • Registratie: Februari 2023
  • Niet online
strcmp heeft als resultaat 0 als beide strings gelijk zijn, dus zoals je het eerst had klopt het, met == 0. Wat hcQd zegt klopt, je zult wel de input string op 0 moeten initialiseren, anders is byte 5 random data en zal je dus nooit een gelijke string hebben.

Acties:
  • +1 Henk 'm!

  • BLACKfm
  • Registratie: Maart 2004
  • Laatst online: 14-05 13:16
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
void loop() 
{
  int Code = 0;
  char user_input_pass[5] = { 0 };
  Serial.println("Toets 4 cijfers in");
  while (Code < 4){
      char Key = customKeypad.getKey();
      if (Key) {
        user_input_pass[Code++] = Key;
        Serial.print(Key); // debug
      }
        // else
  }
  
  if (Code == 4){ // indien 4 toetsen zijn ingedrukt gaan we hier mee verder
    Serial.println("De code is");
    Serial.print(user_input_pass); // Geeft 2502 of 3344 in console
    Serial.println("\n\n");
    
      if (strcmp(user_input_pass, "2502") == 0) {
          Serial.println("Code 2502 geaccepteerd");
       } 
      if (strcmp(user_input_pass, "3344") == 0) { 
          Serial.println("Code 3344 geaccepteerd");
       }
     // etc.        
   }
}


Aaahh nice! :D. Het lijkt nu te werken zoals het de bedoeling is. Thanks y'all!

Litebit.eu voorraad check :).

Pagina: 1