字符串在 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中,b
和c
打印正常(都是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}
我是 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中,b
和c
打印正常(都是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}