【问题标题】:String becomes empty in an Arduino SPI transfer codeArduino SPI 传输代码中的字符串为空
【发布时间】:2017-07-31 07:39:06
【问题描述】:

我是 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

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

非常感谢。

【问题讨论】:

  • C != C++。仅使用您使用的语言标记一个。
  • 我认为最好将sent.cmd[4]="def" 更改为strcpy(send.cmd, "def")。您编码的指令将指向"def" 的指针的值分配给最多包含4 个字节的字符数组的第5 个字符。 ;)

标签: c++ string arduino spi


【解决方案1】:

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}

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      警告不应被忽视!

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

      正确的方法是复制 C-strings:

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

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

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

      【讨论】:

        猜你喜欢
        • 2023-01-10
        • 1970-01-01
        • 2019-06-16
        • 1970-01-01
        • 1970-01-01
        • 2012-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多