Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/151.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 字符串在Arduino SPI传输代码中变为空_C++_String_Arduino_Spi - Fatal编程技术网

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

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"

我是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
//主机
#包括
#包括“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}