2016-10-30 5 views
1

У меня есть доска, которая выводит строки текста на последовательный. Мне нужно сравнить эти строки текста с теми, которые я знаю. По сути, я хотел бы сделать strcmp(thestring,F("knownstring")), однако, похоже, не существует версии strcmp, которая использует тип FlashStringHelper *. Существует strcmp_P, который использует const PROGMEM char *, но это, кажется, совсем другое. Кто-то на форуме Arduino, который я видел, предложил написать один, пройдя флэш-строку с progmem_read_byte (b, i), но эта функция фактически не существует, и ближайший эквивалент (pgm_read_byte(b+i)), похоже, не работает с FlashStringHelper * - я получаю ошибки, такие как error: invalid use of incomplete type 'class __FlashStringHelper' и error: forward declaration of 'class __FlashStringHelper', что подразумевает, что я что-то сделал серьезно не так! Я почти нахожусь в состоянии сдаться и помещать строки в ОЗУ вместо этого, но у arduino не так много, поэтому я хочу избежать этого, если это возможно. Может ли кто-нибудь помочь?Как сравнить __FlashStringHelper * с char * на Arduino?

ответ

2

__FlashStringHelper - только специальный тип данных, используемый для определения правильной перегруженной функции/метода для строк Flash.

В любом случае вы не можете использовать strcmp, как это для сравнения двух строк в оперативной памяти, но в заголовочном <avr/pgmspace.h> есть свой вариант strcmp_P для сравнения const char * помещается в ОЗУ с const char * помещается в памяти FLASH (в таком порядке).

Таким образом, вы можете использовать:

strcmp_p(thestring, (const char*)F("knownstring")); 
// or better: 
strcmp_P(thestring, PSTR("knownstring")); 

F макросъемки в основном: (__FlashStringHelper *)PSTR("...") так это немного излишним, чтобы бросить его обратно в const char* в первом случае.

Смежные вопросы