【问题标题】:Arduino function can't edit arrayArduino函数无法编辑数组
【发布时间】:2020-01-30 11:27:11
【问题描述】:

背景

我编写了一个 Arduino 函数,它通过串行连接接收格式为 "a,b,c,d,e" 的字符串,其中 a、b、c、d、e 是整数,我尝试使用这些整数更新一个数组收到新字符串的时间。数据被接收并解析为单独的整数,但数组不会正确更新。

尝试

下面是代码,我没有使用getData() 函数,因为它所做的只是从串行连接接收字符串并将其存储在字符数组中input(该部分工作正常)。

void setup() {
    Serial.begin(9600);
}

void loop() {
    getData();
    if(parsed == false){
        parseData(readings);
    }
}

void parseData(int readings[]) {
    x = 0;
    char * split;
    split = strtok(input,",");
    while (split != NULL)
    {
        readings[x] = split;
        split = strtok (NULL, ",");
        x++;
    }
    parsed = true;
}

问题

如果我发送一个像"6,7,8,9,0" 这样的字符串,则无论我发送什么值,数组readings[] 都会更新为[289,291,293,295,297],我已经检查了split 在函数内部接受的值并且它们是正确的,但是readings[x] = split; 行无法按该顺序将数组元素更新为这 5 个数字以外的任何内容。在parseData 函数内部或外部检查readings[n] 的值时就是这种情况。

另外,如果我在字符串中发送少于 5 个整数,例如a,b,c,只有第一个数组元素会改变,其他元素将保持为 0,例如[289,291,293,0,0]

在我发现将数组指针传递给函数之前,完全相同的事情发生在稍微不同的代码中——当我在循环中调用函数时,我只使用了parseData();,而当我定义了我刚刚使用的函数时void parseData(){

问题

为什么数组没有正确更新,我该如何解决?

【问题讨论】:

  • readingsinput 声明在哪里?
  • readings[x] = split; split 是一个指针。
  • @P0W 哎呀,我错过了 - 它们在开始时被声明为全局变量 int readings[5];char input[64];,以及 boolean parsed = true;
  • @AlexF 我刚试过,谢谢,但现在我只是在数组 [49,50,51,52,53] 中得到不同的不正确值 - * 有什么作用 - 我只在之前使用 Arduino 的基础水平,但从未在使用它的教程或演示中正确解释过它?
  • @S.Dunnim 当您Serial.print(char pointer) 时,它将指针视为指向字符串开头的指针,并打印字符串。指针错误地存储在数组中,因为它是整数数组,而不是指针数组。

标签: c++ arrays arduino


【解决方案1】:

您的readings 是一个整数数组。 而split 是一个指向字符的指针。

声明

readings[x] = split

将split(字符的地址)存储为整数值。

如果我写

const char *pointer = "42";
int address = pointer;

将整数值 42 存储在 address 中 - 我正在存储标识字符串中第一个字符的内存位置的数字。

如果要将字符串转换为整数,则需要使用strtol之类的函数进行解析。

【讨论】:

  • 谢谢,我最终使用了atoi,因为它更简单。应该意识到我正在尝试将 char 存储在 int 数组中!
  • @S.Dunnim 实际上是char* 数组中的int
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多