我有一个 Arduino 和一个 APC220 无线收发器。我正在编写一个使用 SoftwareSerial 类从 APC 读取数据的库。我最初从下面的(不正确的)代码开始,它导致了段错误,因为i
即使没有可读取的数据,变量也会递增。如果它碰巧起作用(碰巧当数据立即可用时),这个函数大约需要 6 毫秒来执行。当我将i++;
语句放在适当的位置(在它正上方的右大括号上方)时,该函数需要超过 270 毫秒才能运行。速度对于此功能至关重要,所以我想知道该语句的位置是什么导致时间如此显着增加。
对于下面的代码,buff
被声明为char buff[10];
并且 sSerial 是SoftwareSerial
unsigned long updateLocation(Marker* marker) {
this->sSerial->print('~');
//initiate request from vision system
this->sSerial->flush();
this->sSerial->print('#');
this->sSerial->print(marker->num);
this->sSerial->print('*');
this->sSerial->flush();
unsigned long start = millis();
int state = 0, i = 0;
while((millis() - start) < 600) {
if(this->sSerial->available()) {
buff[i] = this->sSerial->read();
if(buff[i] == ',') {
buff[i] = 0;
switch(state) {
case 0:
i = -1;
state++;
break;
case 1:
marker->x = atof(buff);
i = -1;
state++;
break;
case 2:
marker->y = atof(buff);
i = -1;
state++;
break;
case 3:
marker->theta = atof(buff);
i = -1;
return (millis() - start);
break;
default:
return 0;
break;
}
}
// Correct location for i++; takes 270 ms to execute
}
// Incorrect location for i++; Takes 6 ms to execute
i++;
}
this->sSerial->print('~');
this->sSerial->flush();
return 0;
}