字符串在 Arduino SPI 传输代码中变为空

String becomes empty in an Arduino SPI transfer code

我是 Arduino 的新手,我正在尝试使用 SPI 将数据从一个 Arduino 传输到另一个。我在发送字符数组(C 字符串)时遇到问题。首先,我认为问题在于定义字符串本身(因为我试图在同一个 Arduino 上连续打印它并且它确实有效),所有其他数据类型都正常发送,但由于某种原因字符串变为空白(当我连续打印它们时, 而是打印一个空行。

这是master的代码,slave的代码也有同样的问题

// 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

在monitor中,bc打印正常(都是slave过来的数据),但是cmd打印为空行(都是接收到的数据)和发送)。

非常感谢。

您尝试过使用 String 类型而不是 char[] 吗?

重复和长时间工作的原因是它们指向单个引用。 cmd 指向一个包含 4 个引用的数组。如果它适用于字符串,则可能是您处理 char 数组的 reading/printing 的方式。如果您担心内存问题,请改用 char*。

警告不应被忽略!

这一行sent.cmd[4] = "def";太糟糕了。您将 cmd 声明为一个包含 4 个字符的数组,并尝试在其第 5 个字符中写入一个指向乱码字符串的指针!这可能不是您想要做的,但这是编译器将尝试做的...

正确的方法是复制 C-strings:

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

或者,您可以使用支持分配但使用动态内存的 C++ std::string,因此在您的用例中它可能是也可能不是一个选项。

顺便说一句,C 和 C++ 是不同的语言,只有一个共同的子集。几乎不可能用 C 和 C++ 编写正确的代码,所以请选择一个。

Serge Ballesta 指出了问题:您将 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}