我正在尝试解析Arduino中GSM模块的以下输出,仅得到电压(3.900V
)部分。但是,我无法正常工作。
"
+CBC: 0,66,3.900V
OK
"
我尝试了以下代码,但失败,甚至崩溃。
float getVoltage() {
if (atCmd("AT+CBC\r") == 1) {
char *p = strchr(buffer, ',');
if (p) {
p += 3; // get voltage
int vo = atof(p) ;
p = strchr(p, '.');
if (p) vo += *(p + 1) - '0'; // ??
return vo;
}
}
return 0;
}
如何以更好或更透明的方式完成此任务?
答案 0 :(得分:1)
您可以使用C函数strtok
来标记缓冲区
void setup() {
Serial.begin(115200);
char buffer[20] = "+CBC: 1,66,3.900V";
const char* delims = " ,V";
char* tok = strtok(buffer, delims); // +CVB:
tok = strtok(NULL, delims);
int first = atoi(tok);
tok = strtok(NULL, delims);
int second = atoi(tok);
tok = strtok(NULL, delims);
float voltage = atof(tok);
Serial.println(first);
Serial.println(second);
Serial.println(voltage);
}
void loop() {
}
答案 1 :(得分:0)
此问题已解决:
float getVoltage() {
if (atCmd("AT+CBC\r") == 1) {
char *p = strchr(buffer, 'V');
if (p) {
p -= 5; // get voltage
double vo = atof(p) ;
//printf("%1.3f\n", vo);
return vo;
}
}
return 0;
}