В Arduino Wire.read()
читает однобайтовый * только 1005 * (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'
) или следитеиндекса в строке сравнения, который вы сбрасываете в ноль при каждом несовпадении.