字符串在 Arduino SPI 传输代码中变为空
String becomes empty in an Arduino SPI transfer code
我是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
在监视器中,b
和c
正常打印(来自从站的数据(,但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++ 编写正确的代码几乎是不可能的,所以请选择一个。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 字符串在 Arduino SPI 传输代码中变为空
- 如何修复将传输到 java 的 2d 数组代码使用 JNI
- 如何将我的代码从 I7 处理器传输到 (AWS) 上的至强处理器
- 苹果安全传输代码错误
- Qt Creator中的代码传输
- 无法将像素以正确的形状从 cv 代码传输到 cv2 代码的正确图像
- gstreamer 管道代码,用于通过来自相机的实时流式传输而不是图像显示文本
- 在将复杂数据从主机传输到设备的简单 CUDA 代码中出现问题
- 通过蓝牙将文件从PC传输到其他设备的代码示例c++