【发布时间】: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(){
问题
为什么数组没有正确更新,我该如何解决?
【问题讨论】:
-
readings和input声明在哪里? -
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)时,它将指针视为指向字符串开头的指针,并打印字符串。指针错误地存储在数组中,因为它是整数数组,而不是指针数组。