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

String becomes empty in an Arduino SPI transfer code

本文关键字:代码 传输 Arduino SPI 字符串      更新时间:2023-10-16

我是Arduino的新手,我正在尝试使用SPI将数据从一个Arduino传输到另一个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

在监视器中,bc正常打印(来自从站的数据(,但cmd打印为空行(接收和发送(。

多谢。

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}

您是否尝试过使用字符串类型而不是 char[]?

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

警告不应该被忽视!

这句台词sent.cmd[4] = "def";很糟糕。您声明cmd是一个包含 4 个字符的数组,并尝试在第 5 个字符中写入指向 litteral 字符串的指针!这可能不是你打算做的,但这就是编译器会尝试做的......

正确的方法是复制C 字符串:

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

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

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