Ошибка в Arduino IDE при использовании функции strncmp

Я использую следующий код, чтобы сравнить две строки и получить ошибку:

>  #define _EXFUN(name, proto)  name proto
>
>                               ^
>
> exit status 1 invalid conversion from 'char' to 'const char*'
> [-fpermissive]

Как я понимаю, функция strncmp ищет ‘const char *’, но когда я преобразую ‘chat’ в ‘const char *’, я получаю странные результаты в последовательном мониторе:

> Exception (28): epc1=0x40209035 epc2=0x00000000 epc3=0x00000000
> excvaddr=0x00000030 depc=0x00000000
>
> ctx: cont  sp: 3ffffda0 end: 3fffffd0 offset: 01a0
>
> >>>stack>>> 3fffff40:  40100fee 3ffe8c3c 000026fe 00000000   3fffff50:  401011c4 000026fe 3ffee75c 00000000   3fffff60:  3ffe8c70 3ffee75c
> 3ffe850c 3ffee75c   3fffff70:  3ffee6e0 3ffee7c8 40202fe8 3fffefb0
> 3fffff80:  402014ce 00000001 00000001 402014c3   3fffff90:  00002580
> 3ffee6dc 00000014 4020292c   3fffffa0:  feefeffe 00000000 3ffee7c0
> 3ffee7c8   3fffffb0:  3fffdad0 00000000 3ffee7c0 40203074   3fffffc0:
> feefeffe feefeffe 3ffe850c 401000e5   <<<stack<<< ?)⸮

Сам код:

#include <Wire.h>
#define I2C_ESP_ADDRESS 8
int count=0;
char model;
char reading;
char incoming;

void setup()
{
Serial.begin(9600);
Wire.begin(5,4);//Change to Wire.begin() for non ESP.
/*model[0] = "e";
model[1] = "0";
for (int i = 1; i < 20; i++) {
model[i] = 0;
}*/
}

void loop()
{
Wire.requestFrom(I2C_ESP_ADDRESS,20);
while (Wire.available())
{
delay(1);
incoming = Wire.read();

if (strncmp(incoming,"elxxxxxxxxxxxxxxxxxx",2) == 1 ) {
model = incoming;
} else {
reading = incoming;
}
}
}

1

Решение

На Ардуино, Wire.read() читает один байт только (char).

strncmp хочет сравнить две строки с нулевым символом в конце (const char *), и на самом деле не имеет дело с одиночными символами, поэтому вы получаете ошибку компилятора: он говорит вам, что вы не можете просто обработать char как будто это было const char *,

Когда вы заставляете это делать это в любом случае, бросая const char *, он обрабатывает значение этого единственного байта как указатель, и strncmp читает места в памяти, которые, вероятно, не должны (независимо от того, что находится по адресу, указанному значением байта). Это вызывает аварию, которую вы видели.

По сути, между двумя путаницами строки (последовательность байтов с нулевым байтом в конце) и персонажи (всего один байт) здесь. В памяти разница выглядит так:

          +----+
char '*': | 42 |
+----+

              +----+----+----+----+
string "***": | 42 | 42 | 42 |  0 |
+----+----+----+----+

И то и другое incoming а также model в настоящее время способны удерживать только один символ. Если вы хотите сохранить несколько символов, рассмотрите возможность использования массива (char incoming[SIZE], где SIZE это максимальный размер данных).

Затем вы можете записать входящие байты в последующие позиции в массиве и в конечном итоге сравнить всю строку сразу, используя strncmp как ты делал раньше

Если вы действительно хотите сравнивать отдельные байты по мере их поступления, просто сравните их напрямую (incoming == 'x') или следите за индексом в строке сравнения, которую вы сбрасываете в ноль при каждом несовпадении.

0

Другие решения

Так что это правильный код, который работал для меня:

void loop() {

Wire.requestFrom(I2C_ESP_ADDRESS,18);
while (Wire.available()){incoming = Wire.read();
Serial.print(incoming);
//Serial.print(incoming);

//sprintf (incomingArray, "%.20", incoming);

if ( incoming == 'e') {
modelArray[0] = 'e';for (int i = 1; i < 18; i++ ){
modelArray[i] = (char) Wire.read();
Serial.print(modelArray[i-1]);
}
}if ( incoming == 'a') {
readingArray[0] = 'a';
// Serial.print("Got Reading: ");

for (int j = 1; j < 18; j++ ){
readingArray[j] = (char) Wire.read();
Serial.print(readingArray[j-1]);
}

Serial.println();

}}
0

По вопросам рекламы [email protected]