Passerords kontroll
ATmega328P.pdf ( Register summary on p 428 )ANSI-C har många funktioner för stränghantering. För småprocessorer kan detta vara aldeles för komplexa och omfattande funktioner. Den genererade koden kan också bli onödigt stor. Ett alternativ är att skriva egna anpassade funktioner. Då vet man dessutom bättre hur dom fungerar i detalj.
Ofta behöver man en enkel funktion för att mata in en sträng till en buffer,
och avsluta inmatningen med return-tangenten.
Return-tangenten har olika funktion i olika operativsystem.
I Windows genererar return-tangenten två tecken i följd,
"\r\n". Linux använder '\n', Mac använder '\r'.

Arduinos terminalfönster tillåter olika inställningar. Inmatningsfunktionen nedan är skriven för Windows.
Den fyller en buffer med de inmatade tecknen och avslutar med strängslutstecknet '\0' när
man trycker på return-tangenten.
Vid (MAX_STRING-1) tecken slutar den att räkna upp buffern för att förhindra överfyllnad.
I stället för att funktionen ekar de inmatade tecknen kan man eka putchar_uart('*') om det gäller inmatning av ett passerord.
Funktionen är blockerande tills den mottagit det rätta return-tecknet.
void string_in_uart( char * string ) // Expects '\r' + '\n' to end input. Windows style.
{
unsigned char charCount, c;
for( charCount = 0; ; charCount++ )
{
c = getchar_uart( ); /* input 1 character */
string[charCount] = c; /* store the character */
putchar_uart( c ); /* echo the character */
if(c=='\r' ) charCount-- ; /* skip and wait for '\n' to end input */
if( c=='\n'){ string[charCount] = '\0'; return; } /* end of string and end of input */
if( charCount == (MAX_STRING-1)) charCount-- ; /* prevent buffer overflow */
}
}
Nu måste den inmatade strängen kunna jämföras med olika lagrade strängkonstanter. Man skickar med bufferns och strängkonstantens startadresser till en funktion check_password() som returnerar "1" vid träff och "0" annars.
unsigned char check_password( char * input_string, const char * candidate_string )
{
unsigned char i;
for(i=0; ; i++)
{
if(candidate_string[i] != input_string[i] ) return 0; /* no match - give up */
if( candidate_string[i] == '\0' ) return 1; /* exact match up to length of candidate */
}
}
![]()

password.txt
(for Arduino use code stored as: password\password.ino)Vid programstart så kopieras normalt strängkonstanter över till RAM-minnet, GPU registren,
för att bli åtkomliga med indexering eller med pekare. RAM-minnet är litet.
Behöver man lagra mycket data i form av strängkonstanter i sitt program så vill man i stället kunna nå dem
direkt i från programminnet.
Då behöver man använda makron från inkluderingsfilen pgmspace.h.
Programversionen password_P är skriven med användning av dessa makron.
password_P.txt
(for Arduino use code stored as: password_P\password_P.ino)
William Sandqvist william@kth.se