我正在使用arduino接收来自RF69芯片的射频信息。
该消息包含天气数据,如温度、湿度和气压。
接收到的字符串如下所示: 1:22.26:41.53:1023.73 (msg类型:temp:hum:pres)
我需要将其转换为数组,然后将数据复制到浮点值中。
使用strtok,我可以复制一些数据,但我似乎缺少一些值。
Serial.print("Message: ");
Serial.println((char*)buf); //Message: 1:22.32:41.39:1023.77
char* data;
data = (char*)buf; //incoming from radio buffer
char separator[] = ":"; //delimeter
char *array[3]; //expect 3 value
int i=0; //start loop at 0
array[i] = strtok(data,separator); //first token
while(array[i]!=NULL) {
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}这似乎是正确的输出:
Message: 1:22.32:41.18:1023.77
22.32
41.18
1023.77然后,当我分配浮点数时,我忽略了t值:
float t = atof(array[1]);
float h = atof(array[2]);
float p = atof(array[3]);
Serial.print("Temperature = "); Serial.println(t);
Serial.print("Rel. Humidity = "); Serial.println(h);
Serial.print("Pressure = "); Serial.println(p);输出:
Temperature = 0.00
Rel. Humidity = 41.33
Pressure = 1023.78有人能解释一下为什么我遗漏了温度值吗?
另外,由于我对C没有经验,是否有更好的方法来做到这一点?
发布于 2020-01-18 10:19:27
此代码:
while( array[i] != NULL){
array[++i] = strtok(NULL,separator);
Serial.println(array[i]);
}写入超出界限的array[3]和array[4]。压力字段被写入array[0],然后NULL被写入array[4]。
改为:
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}它覆盖在array[0]上的指针,该指针具有您要丢弃的消息类型,并迭代直到提取所有字段,而不是当strtok()返回NULL时。
然后更改atof()中的索引
float t = atof(array[0]);
float h = atof(array[1]);
float p = atof(array[2]);您还可以验证消息类型是否正确。
array[i] = strtok(data,separator); //first token
if( array[i][0] == '1' && array[i][1] == 0 )
{
while( i < sizeof(array) / sizeof(*array) &&
array[i] != NULL)
{
array[i] = strtok(NULL,separator);
Serial.println(array[i]);
i++ ;
}
}实际上,如果您希望保留消息类型,那么array需要4个元素,循环主体将变成:
i++ ;
array[i] = strtok(NULL,separator);
Serial.println(array[i]);您可以按照原始代码预先增加array[++i],但我不建议使用它--它不能提供清晰性,而且在更复杂的表达式中使用时语义和顺序变得复杂--总是使用它“独立”以避免错误和误解。
https://stackoverflow.com/questions/59799346
复制相似问题