我正在寫一個應用程序與Android手機通過藍牙來控制我的機器人,一切都順利的話,數據是呼應和確認,但我有一些麻煩的協議,特別是我希望我的當我發送一個命令,如s,10,100
或s,-30,-10
...(值以百分比表示)時,機器人的輪子會轉動。Arduino的串行數據分析
我的問題是,當我想在我的Arduino解析我的車輪轉速命令我必須從多達4單獨bytes
解析到int
,例如s,-100,-100
讓我的機器人全速後退去,但我該怎麼辦解析這個,所以我可以撥打setSpeed(left, right);
與left
和right
等於-100?
我知道我可以分別分析每一個字節,並把它們放在一起得到一個整數,但它不是很優雅,很可能有一個更好的解決這一切已經,不幸的是我還沒有發現它。
編輯
這是我的Arduino函數解析我的命令:
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;
}
你這樣調用它在解析時像s,100,-100
(必須是\0
終止):
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));
}
}
你只是打敗了我,再一次:(一個char-by-char狀態機就像你可以得到的靈活性,可維護性和可擴展性一樣。隨着新命令的添加,涉及大量庫函數的解決方案會非常迅速地變得混亂。 –
似乎有很多麻煩,我認爲這是一個相對常見的問題,所以也許現有的功能可以做到這一點...狀態機是時候。 – Solenoid
一半的工作將處理錯誤條件。 –