Когато работите с низове в Arduino, има няколко начина да ги сравните. Една от най-полезните функции е strcmp(), който принадлежи към стандартната библиотека C, cstring
. Тази функция ви позволява да сравнявате два низа от символи (низове) по директен начин, връщайки стойност, която ни казва дали низовете са еднакви или има някаква разлика между тях.
В Arduino символните низове обикновено се обработват чрез обекти на класа String
, въпреки че също е опция за работа символни масиви, особено ако искаме да оптимизираме ресурсите или да работим с код с малко памет. Нека се задълбочим в това как правилно да използвате функцията strcmp() и други алтернативи, които също са полезни в тази среда.
Какво е strcmp()
и как работи на Arduino?
Функцията strcmp()
Има доста просто поведение: взема два низа от знаци, сравнява ги символ по знак и връща стойност въз основа на това сравнение. Методът оценява ASCII стойности на героите, което е важно да се има предвид. Възможните резултати от това сравнение са следните:
- Ако веригите са еднакви,
strcmp()
Върни 0. - Ако първият символ, който се различава, има по-ниска ASCII стойност в първия низ, функцията ще се върне отрицателно число.
- Ако несъответстващият знак на първия низ е по-голям, той ще се върне положително число.
Практически пример за използване на функцията strcmp()
е да сравним два низа, които въвеждаме или генерираме с помощта на други функции. Например, можем да създадем програма, която събира потребителски данни и, сравнявайки със съхранен низ, проверява дали информацията е правилна.
Важни разлики между strcmp()
и други функции
Когато работите с низове в Arduino, има и други алтернативи strcmp()
които най-добре отговарят на вашите нужди. Един от тях е memcmp()
, който извършва сравнение на ниво памет, полезно, когато не искаме да разчитаме на нулев терминатор в нашите низове. За разлика от strcmp()
, който е проектиран да работи с низове с нулев край, memcmp()
той просто сравнява определен брой байтове.
Нека да разгледаме неговия основен синтаксис:
if (memcmp(payload, "cadena", longitud) == 0) { // Ejecuta la acción}
Като се има предвид неговата гъвкавост, това е много полезна опция, ако работите с части от данни или съобщения с фиксирана дължина, които трябва да се сравняват байт по байт.
Конкретни случаи на употреба: наблюдение и сравнение на низове в реално време
Представете си, че работите върху проект, в който получавате информация в реално време и трябва да я сравните с конкретна стойност. Функцията strcmp() Това е ключов инструмент в този тип ситуации. Например, ако сравнявате данни, получени от сензор, и искате да потвърдите дали съвпада с предварително зададена стойност, strcmp() ще ви позволи да направите това ефективно.
В този кодов фрагмент сравняваме дали стойността, получена от pH сензор, съответства на определени калибрирани стойности:
if (strcmp(inputString, "CAL,4") == 0) { // Acción cuando se recibe el valor de calibración}
Този тип сравнение е от решаващо значение в приложения, където данните могат да варират и ние трябва да вземаме решения въз основа на резултата от показанията.
Други методи за работа с низове
Освен strcmp()
, можете да използвате и други функции в екосистемата Arduino. Функцията compareTo
, например, е част от класа String
и улеснява сравняването на обекти от този клас. въпреки че strcmp()
По-често се среща при реализации на ниско ниво или с масиви от знаци, compareTo
полезно, ако вече работите с обекти String
.
Ето някои допълнителни методи, които можете да използвате:
- compareTo(): Сравнете два обекта
String
и връща сравнителна стойност, както вstrcmp()
. - равно на (): Проверява дали два низови обекта са напълно еднакви, връщайки true или false.
Често срещани проблеми и как да ги коригирате
Една от най-честите грешки при използване strcmp()
на Arduino не гарантира, че низовете са правилно завършени с a \0
(нулев знак). Ако низът не е прекратен правилно, функцията ще продължи да сравнява в паметта повече от очакваното, което може да доведе до неочаквани грешки или нестабилно поведение.
Ако подозирате, че вашите низове не са завършени правилно, можете да прибегнете до решения като memcmp()
, който не зависи от нула за ограничаване на низа и ви позволява да посочите конкретен брой байтове за сравнение.
Друг проблем, който може да срещнете, е когато сравнявате низове, които може да сте получили чрез сериен вход. Винаги трябва да почиствате и форматирате низовете, преди да опитате каквито и да било сравнения.
Пример за пълно изпълнение
За да илюстрирате как тези инструменти работят в реален проект, ето пример, който комбинира сравнение на низове с функцията Serial.println()
За да покажете резултатите на серийния монитор Arduino:
#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() { }
Този код сравнява два низа и показва резултатите на монитора. Това е добър пример за практическото използване на strcmp()
в реални приложения на Arduino за ефективно сравняване на текстови низове.
В допълнение към сравнението можете да използвате изхода на strcmp()
в рамките на условни структури като if
за извършване на определени действия, когато низовете съвпадат или не.
Оптимизация в проекти с ограничен ресурс
Както може би вече сте забелязали, използването на strcmp()
и подобни функции е много ефективна опция, когато имаме проекти с ограничения на паметта, което е доста често срещано в проектите на Arduino. Когато използвате масиви от символи вместо обекти String
, ние оптимизираме потреблението на памет, което е от съществено значение при работа с микроконтролери с малък капацитет за съхранение.
И накрая, важно е да подчертаете, че в проекти, в които работите със сензори, интерфейси или комуникационни модули, е важно да валидирате всяка получена информация, за да избегнете грешки при изпълнение или нежелано поведение.
Всички от горепосочените, strcmp()
Това е много гъвкав инструмент, който се адаптира към множество сценарии, от най-простите до много по-сложни приложения, където се изисква оптимизиране на ресурсите и вземане на решения въз основа на верижни сравнения.