Строка становится пустой в коде передачи SPI Arduino

Я новичок в Arduino и пытаюсь перенести данные с помощью SPI из одного Arduino в другой. У меня проблема с отправкой массива символов (строка C). Во-первых, я думаю, что проблема заключается в определении самой строки (так как я пытался последовательно печатать ее на том же Arduino, и она работала), все другие типы данных отправляются нормально, но строки по какой-то причине становятся пустыми (когда я последовательно печатаю их вместо этого выводится пустая строка.

Вот код для мастера, та же проблема с подчиненным кодом.

// master
#include <SPI.h>
#include "SPI_anything.h"
// create a structure to store the different data values:
typedef struct myStruct {
char cmd[4];
double b;
long c;
};

myStruct sent;
myStruct recieved;

void setup () {
Serial.begin(115200);
SPI.begin ();
// Slow down the master a bit
SPI.setClockDivider(SPI_CLOCK_DIV16);
sent.cmd[4] = "def";
sent.b = 32.2;
sent.c = 100000;
}  // end of setup

void loop ()  {
digitalWrite(SS, LOW);    // SS is pin 10
// SPI_writeAnything (sent);
delay(20);
Serial.println (SPI_readAnything (recieved));
String command=recieved.cmd;
Serial.println (recieved.cmd);///////////
Serial.println (sent.cmd);/////////////
Serial.println (command);
Serial.println (recieved.b);
Serial.println (recieved.c);
Serial.println ();
digitalWrite(SS, HIGH);
delay (1000);  // for testing
sent.c++;
}  // end of loop

В мониторе b а также c печатаются нормально (данные поступают от ведомого), но cmd печатается как пустая строка (как полученная, так и отправленная).

Большое спасибо.

-1

Решение

Серж Баллеста указал на проблему: вы установили четвертый элемент cmd массив на значение указателя на строку, что не является тем, что вы намеревались сделать.

Вместо этого вы можете инициализировать структуру одновременно с объявлением, как в следующем примере (это не явный код Arduino, но совместимый с C / C ++).

#include <stdio.h>

typedef struct myStruct {
char cmd[4];
double b;
long c;
} myStruct;int main(int argc, char const *argv[])
{
myStruct s = {
"def", 3.0, 10000
};
printf("{%s, %f, %li}", s.cmd, s.b, s.c);
return 0;
}

Сохранение этого в файл structTest.c, компилирование и запуск:

$ gcc structTest.c -o structTest
$ ./structTest.exe
{def, 3.000000, 10000}
0

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

Вы пробовали использовать тип String вместо char []?

Причиной двойной и длительной работы является то, что они указывают на одну ссылку. cmd указывает на массив из 4 ссылок. Если это работает со строкой, это может быть то, как вы обрабатываете чтение / печать массива char. Если вас беспокоят проблемы с памятью, используйте char * вместо этого.

0

Предупреждения не должны игнорироваться!

Эта линия sent.cmd[4] = "def"; это ужасно Вы объявили cmd быть массивом из 4 символов, и вы пытаетесь написать указатель на буквальную строку в 5-м символе! Возможно, это не то, что вы намеревались сделать, но именно это попытается сделать компилятор …

Правильный путь заключается в копия C-строка:

strncpy(sent.cmd, "def", 4);

В качестве альтернативы вы можете использовать C ++ std::string который поддерживает назначение, но использует динамическую память, так что это может быть или не быть вариантом в вашем случае использования.

Кстати, C и C ++ — это разные языки, только с общим подмножеством. Правильное написание кода на C и C ++ практически невозможно, поэтому, пожалуйста, выберите один.

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