Dirbant su stygomis „Arduino“, yra keletas būdų jas palyginti. Viena iš naudingiausių funkcijų yra strcmp (), kuri priklauso C standarto bibliotekai, cstring
. Ši funkcija leidžia tiesiogiai palyginti dvi simbolių eilutes (eilutes), grąžinant reikšmę, nurodančią, ar eilutės yra vienodos, ar tarp jų yra kokių nors skirtumų.
„Arduino“ simbolių eilutės paprastai tvarkomos per klasės objektus String
, nors tai taip pat yra galimybė dirbti simbolių matricos, ypač jei norime optimizuoti išteklius arba dirbti su mažai atminties turinčiu kodu. Panagrinėkime, kaip tinkamai naudoti funkciją strcmp () ir kitos alternatyvos, kurios taip pat naudingos šioje aplinkoje.
Kas yra strcmp()
ir kaip tai veikia Arduino?
Funkcija strcmp()
Jis veikia gana paprastai: paima dvi simbolių eilutes, lygina jas po simbolius ir pagal tą palyginimą pateikia vertę. Metodas įvertina ASCII reikšmės veikėjų, o tai svarbu nepamiršti. Galimi šio palyginimo rezultatai:
- Jei grandinės yra vienodos,
strcmp()
sugrąžink 0. - Jei pirmojo skirtingo simbolio pirmojoje eilutėje yra mažesnė ASCII reikšmė, funkcija grįš neigiamas skaičius.
- Jei pirmosios eilutės neprilygstamas simbolis yra didesnis, ji grįš teigiamas skaičius.
Praktinis funkcijos naudojimo pavyzdys strcmp()
yra palyginti dvi eilutes, kurias pristatome arba generuojame naudodami kitas funkcijas. Pavyzdžiui, galime sukurti programą, kuri renka vartotojo duomenis ir, lyginant su saugoma eilute, patvirtina, ar informacija teisinga.
Svarbūs skirtumai tarp strcmp()
ir kitas funkcijas
Dirbant su stygomis „Arduino“, yra ir kitų alternatyvų strcmp()
kuri gali geriausiai atitikti jūsų poreikius. Vienas iš jų yra memcmp()
, kuris atlieka atminties lygio palyginimą, naudingą, kai nenorime pasikliauti nuliniu terminatoriumi savo eilutėse. Skirtingai nei strcmp()
, kuris skirtas dirbti su nulinėmis eilutėmis, memcmp()
jis tiesiog lygina konkretų baitų skaičių.
Pažvelkime į jo pagrindinę sintaksę:
if (memcmp(payload, "cadena", longitud) == 0) { // Ejecuta la acción}
Atsižvelgiant į jos lankstumą, tai labai naudinga parinktis, jei dirbate su duomenų dalimis arba fiksuoto ilgio pranešimais, kuriuos reikia lyginti baitus po baito.
Konkretūs naudojimo atvejai: stygų stebėjimas ir palyginimas realiuoju laiku
Įsivaizduokite, kad dirbate su projektu, kuriame informaciją gaunate realiuoju laiku ir turite ją palyginti su konkrečia verte. Funkcija strcmp () Tai yra pagrindinė priemonė tokioje situacijoje. Pavyzdžiui, jei lyginate iš jutiklio gautus duomenis ir norite patikrinti, ar jie atitinka iš anksto nustatytą reikšmę, strcmp () leis tai padaryti efektyviai.
Šiame kodo fragmente palyginame, ar iš pH jutiklio gauta vertė atitinka tam tikras kalibruotas vertes:
if (strcmp(inputString, "CAL,4") == 0) { // Acción cuando se recibe el valor de calibración}
Toks palyginimas yra labai svarbus tais atvejais, kai duomenys gali skirtis, todėl sprendimus turime priimti remdamiesi rodmenų rezultatais.
Kiti darbo su stygomis metodai
Išskyrus strcmp()
, taip pat galite naudoti kitas Arduino ekosistemos funkcijas. Funkcija compareTo
Pavyzdžiui, yra klasės dalis String
ir leidžia lengviau palyginti tos klasės objektus. Nors strcmp()
Tai dažniau pasitaiko žemo lygio diegimuose arba su simbolių masyvais, compareTo
naudinga, jei jau dirbate su objektais String
.
Štai keletas papildomų metodų, kuriuos galite naudoti:
- palyginti su (): palyginkite du objektus
String
ir grąžina lyginamąją vertę, kaip nurodytastrcmp()
. - lygu (): patikrina, ar du eilutės objektai yra visiškai vienodi, pateikiant teisingą ar klaidingą.
Dažnos problemos ir kaip jas išspręsti
Viena dažniausių klaidų naudojant strcmp()
„Arduino“ neužtikrina, kad eilutės būtų tinkamai užbaigtos a \0
(nulinis simbolis). Jei eilutė nutraukiama netinkamai, funkcija ir toliau lygins atmintyje daugiau nei tikėjotės, o tai gali sukelti netikėtų klaidų arba netinkamo elgesio.
Jei įtariate, kad jūsų eilutės nėra tinkamai nutrauktos, galite imtis tokių sprendimų kaip memcmp()
, kuris nepriklauso nuo nulio, kad atskirtų eilutę, ir leidžia nurodyti konkretų palyginimui skirtų baitų skaičių.
Kita problema, su kuria galite susidurti, yra lyginant eilutes, kurias galėjote gauti per nuoseklųjį įvestį. Prieš bandydami palyginti, visada turėtumėte išvalyti ir suformatuoti eilutes.
Viso įgyvendinimo pavyzdys
Norėdami parodyti, kaip šie įrankiai veikia realiame projekte, pateikiame pavyzdį, kuriame derinamas eilučių palyginimas su funkcija Serial.println()
Norėdami rodyti rezultatus Arduino serijiniame monitoriuje:
#include <string.h> void setup() { Serial.begin(9600); char str1[] = "Hola"; char str2[] = "Hola"; int result = strcmp(str1, str2); if (result == 0) { Serial.println("Las cadenas son iguales"); } else if (result > 0) { Serial.println("La primera cadena es mayor"); } else { Serial.println("La segunda cadena es mayor"); } } void loop() { }
Šis kodas lygina dvi eilutes ir rodo rezultatus monitoriuje. Tai geras praktinio panaudojimo pavyzdys strcmp()
tikrose Arduino programose, kad galėtumėte efektyviai palyginti teksto eilutes.
Be palyginimo, galite naudoti išvestį strcmp()
tokiose sąlyginėse struktūrose kaip if
atlikti tam tikrus veiksmus, kai eilutės sutampa ar ne.
Optimizavimas projektuose su ribotais ištekliais
Kaip jau tikriausiai pastebėjote, naudojimas strcmp()
ir panašios funkcijos yra labai efektyvus pasirinkimas, kai turime projektus su atminties apribojimais, o tai gana įprasta Arduino projektuose. Vietoj objektų naudojant simbolių masyvus String
, optimizuojame atminties suvartojimą, o tai būtina dirbant su mažos atminties talpos mikrovaldikliais.
Galiausiai svarbu pabrėžti, kad projektuose, kuriuose dirbate su jutikliais, sąsajomis ar ryšio moduliais, būtina patvirtinti kiekvieną gautą informaciją, kad išvengtumėte vykdymo klaidų ar nepageidaujamo elgesio.
Visa tai, kas išdėstyta aukščiau, strcmp()
Tai labai universalus įrankis, prisitaikantis prie kelių scenarijų – nuo paprasčiausių iki daug sudėtingesnių programų, kur reikia optimizuoti išteklius ir priimti sprendimus remiantis grandininiais palyginimais.