You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Arduino函数无法正确更新数组问题求助

问题分析与修复方案

核心问题所在

你遇到的问题根源非常明确:你把字符指针的内存地址直接赋值给了int数组,而不是将字符串转换为整数。

在你的代码里,split是char*类型的指针,它指向的是串口接收字符串中被逗号分割出来的子串(比如"6"、"7"这类)。当你执行readings[x] = split;时,编译器并不会自动把字符串转成整数,而是把split这个指针本身的内存地址(一个整数值)存进了数组里——那些289、291之类的奇怪数字,其实就是这些子串在Arduino内存中的地址,和你发送的数值完全无关。

修复后的代码

我们只需要把字符串转成整数,这里用标准库的atoi()函数(ASCII to Integer)就能完成这个转换。另外我补充了一些变量声明的细节(原代码里没体现全局变量的定义,需要确保这些变量能被正确访问):

// 全局变量声明(需要在所有函数外定义,确保跨函数访问)
char input[64]; // 定义足够大的数组存储串口接收的字符串
bool parsed = false;
int x;

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

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

void parseData(int readings[]) {
  x = 0;
  char * split;
  split = strtok(input,",");
  while (split != NULL && x < 5) { // 加x<5防止数组越界
    readings[x] = atoi(split); // 关键:把字符串转成整数后赋值
    split = strtok(NULL, ",");
    x++;
  }
  // 处理输入不足5个元素的情况,将剩余位置清零
  while(x <5){
    readings[x] = 0;
    x++;
  }
  parsed = true;
}

额外注意事项

  1. 数组越界防护:我在while循环里加了x <5的判断,这样如果发送的元素超过数组长度(比如6个值),不会写坏数组之外的内存,避免程序崩溃或出现奇怪的行为。
  2. 更安全的转换函数:如果需要处理非数字输入的情况(比如发送了字母或符号),可以用strtol()替代atoi(),它能返回转换是否成功的状态,示例如下:
    char *endptr;
    readings[x] = strtol(split, &endptr, 10);
    if(*endptr != '\0'){
        // 说明输入的不是合法整数,这里可以做错误处理,比如设为0
        readings[x] = 0;
    }
    
  3. 全局变量的规范:如果不想用全局变量,也可以把input和parsed通过参数传递给parseData函数,减少全局变量带来的耦合性。

内容的提问来源于stack exchange,提问作者sdunnim

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 13:37:29