Я новичок в 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
печатается как пустая строка (как полученная, так и отправленная).
Большое спасибо.
Серж Баллеста указал на проблему: вы установили четвертый элемент 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}
Вы пробовали использовать тип String вместо char []?
Причиной двойной и длительной работы является то, что они указывают на одну ссылку. cmd указывает на массив из 4 ссылок. Если это работает со строкой, это может быть то, как вы обрабатываете чтение / печать массива char. Если вас беспокоят проблемы с памятью, используйте char * вместо этого.
Предупреждения не должны игнорироваться!
Эта линия sent.cmd[4] = "def";
это ужасно Вы объявили cmd
быть массивом из 4 символов, и вы пытаетесь написать указатель на буквальную строку в 5-м символе! Возможно, это не то, что вы намеревались сделать, но именно это попытается сделать компилятор …
Правильный путь заключается в копия C-строка:
strncpy(sent.cmd, "def", 4);
В качестве альтернативы вы можете использовать C ++ std::string
который поддерживает назначение, но использует динамическую память, так что это может быть или не быть вариантом в вашем случае использования.
Кстати, C и C ++ — это разные языки, только с общим подмножеством. Правильное написание кода на C и C ++ практически невозможно, поэтому, пожалуйста, выберите один.