Bluetooth 経由で Android フォンを使用してロボットを制御するアプリを作成しています。すべてがうまくいき、データがエコーされて検証されますが、プロトコルに問題があります。具体的には、送信時にロボットのホイールを回転させたいs,10,100
またはs,-30,-10
...などのコマンド(パーセント単位の値)。
私の問題は、Arduino でホイール速度コマンドを解析したい場合、最大 4 つまで別々bytes
に解析する必要があることint
です。たとえばs,-100,-100
、ロボットを全速力で後退させますが、これを解析してsetSpeed(left, right);
withleft
とright
equalを呼び出すにはどうすればよいですか? -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));
}
}