C++ 字符串在Arduino SPI传输代码中变为空
我是Arduino的新手,我正在尝试使用SPI将数据从一个Arduino传输到另一个Arduino。我在发送字符数组(C字符串)时遇到问题。首先,我认为问题在于定义字符串本身(因为我试图在同一个Arduino上串行打印它,它确实起作用),所有其他数据类型都会正常发送,但字符串由于某种原因变为空白(当我串行打印它们时,会打印一个空行) 这是主程序的代码,从程序的代码也有同样的问题C++ 字符串在Arduino SPI传输代码中变为空,c++,string,arduino,spi,C++,String,Arduino,Spi,我是Arduino的新手,我正在尝试使用SPI将数据从一个Arduino传输到另一个Arduino。我在发送字符数组(C字符串)时遇到问题。首先,我认为问题在于定义字符串本身(因为我试图在同一个Arduino上串行打印它,它确实起作用),所有其他数据类型都会正常发送,但字符串由于某种原因变为空白(当我串行打印它们时,会打印一个空行) 这是主程序的代码,从程序的代码也有同样的问题 // master #include <SPI.h> #include "SPI_anything.h"
// 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
//主机
#包括
#包括“SPI_anything.h”
//创建用于存储不同数据值的结构:
typedef结构myStruct{
char-cmd[4];
双b;
长c;
};
我的命令被发送;
我的命令收到了;
无效设置(){
序列号开始(115200);
SPI.begin();
//让主人慢一点
设置时钟分频器(SPI时钟分频器16);
sent.cmd[4]=“def”;
b=32.2;
c=100000;
}//安装结束
void循环(){
digitalWrite(SS,低);//SS是引脚10
//SPI_写入所有内容(已发送);
延迟(20);
Serial.println(SPI_readAnything(received));
String命令=received.cmd;
Serial.println(received.cmd)///////////
Serial.println(sent.cmd)/////////////
Serial.println(命令);
Serial.println(received.b);
Serial.println(received.c);
Serial.println();
数字写入(SS,高);
延迟(1000);//用于测试
发送的。C++;
}//循环结束
在监视器中,b
和c
正常打印(数据来自从机),但cmd
打印为空行(接收和发送)
非常感谢。您尝试过使用字符串类型而不是char[]吗
双工作和长工作的原因是它们指向一个引用。cmd指向一个包含4个引用的数组。如果它与字符串一起工作,则可能是处理字符数组的读取/打印的方式。如果您关心内存问题,请使用char*。警告不应被忽略 这一行
sent.cmd[4]=“def”
太糟糕了。你声明cmd
是一个4个字符的数组,你试图用它的第5个字符写一个指向一个普通字符串的指针!这可能不是你想要做的,但编译器会尝试这么做
正确的方法是复制C字符串:
strncpy(sent.cmd, "def", 4);
可选地,您可以使用一个C++代码> STD::String ,它支持赋值,但是使用动态内存,因此它可能是您的用例中的一个选项。
、C++和C++是不同的语言,只有一个公共子集。在C和C++中编写代码都是正确的,如果不可能的话,请选择一个。 < P> Serge Ballesta指出:将代码的第四个元素CMD < /Cord>数组设置为一个字符串指针的值,这不是你想要做的。 相反,您可以在声明结构的同时初始化它,如下面的示例所示(它不是显式的Arduino代码,而是C/C++兼容的)
C =!C++。只有一个用于你使用的语言的标签。我认为最好是改变<代码>发送。CMD [ 4 ] =“DEF”<代码> >代码> Strucy(Seord.CMD,“DEF”)< /> >。你所编码的指令将指针的值分配给代码> > DEF“<代码>到一个包含4字节的字符数组的第五字符。)
#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;
}
$ gcc structTest.c -o structTest
$ ./structTest.exe
{def, 3.000000, 10000}