Analiza danych szeregowych Arduino
Piszę aplikację do sterowania moim robotem za pomocą telefonu z Androidem przez Bluetooth, wszystko idzie dobrze, dane są powtarzane i weryfikowane, ale mam problemy z protokołem, szczególnie chcę, aby koła mojego robota obracały się, gdy wysyłam polecenie takie jaks,10,100
lubs,-30,-10
... (wartości w procentach).
Moim problemem jest to, że gdy chcę przeanalizować moje polecenie prędkości koła na moim Arduino, muszę je przeanalizowaćod do 4 oddzielnybytes
doint
, na przykłads,-100,-100
sprawia, że mój robot cofa się z pełną prędkością, ale jak mam to przeanalizować, abym mógł zadzwonićsetSpeed(left, right);
zleft
iright
równy -100?
Wiem, że mogę oddzielnie analizować każdy bajt i zestawiać je razem, aby uzyskać liczbę całkowitą, ale nie jest to zbyt eleganckie i prawdopodobnie jest już lepsze rozwiązanie tego wszystkiego, niestety jeszcze go nie znalazłem.
EDYTOWAĆOto moja funkcja Arduino do parsowania moich poleceń:
void parseCommand(char* command, int* returnValues)
{
// parsing state machine
byte i = 2, j = 0, sign = 0;
int temp = 0;
while(*(command + i) != '\0')
{
switch(*(command + i))
{
case ',':
returnValues[j++] = sign?-temp:temp;
sign = 0;
temp = 0;
break;
case '-':
sign = 1;
break;
default:
temp = temp * 10 + *(command + i) - 48;
}
i++;
}
// set last return value
returnValues[j] = sign?-temp:temp;
}
Nazywasz to w ten sposób podczas analizowania czegoś takiegos,100,-100
(musi być\0
zakończony):
char serialData[16];
void loop()
{
if(Serial.available() > 0)
{
Serial.readBytesUntil('\0', serialData, 15);
switch(serialData[0])
{
case 's':
int speed[2];
parseCommand(serialData, speed);
setSpeed(speed[0], speed[1]);
break;
}
// always echo
Serial.write(serialData);
// end of message is maked with a \0
Serial.print('\0');
// clear serialData array
memset(serialData, 0, sizeof(serialData));
}
}