gpt4 book ai didi

Arduino 串行数据解析

转载 作者:行者123 更新时间:2023-12-04 16:54:18 26 4
gpt4 key购买 nike

我正在编写一个应用程序来通过蓝牙用我的 Android 手机控制我的机器人,一切顺利,数据得到回显和验证,但我在协议(protocol)方面遇到了一些问题,特别是我希望我的机器人的轮子在我发送时转动诸如 s,10,100 的命令或 s,-30,-10 ...(百分比值)。

我的问题是,当我想在我的 Arduino 上解析轮速命令时,我必须解析多达 4 个单独的 bytesint ,例如 s,-100,-100让我的机器人全速倒退,但是我该如何解析这个,所以我可以调用 setSpeed(left, right);leftright等于-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));
}
}

最佳答案

只需将逐个字符读入状态机即可。它简单而高效。

要逐位读取数字,请执行以下操作:从零开始。对于每个数字,将数字乘以十并添加数字的值。因此,例如,读取 97 将像这样工作:

  • 你读入一个没有前面数字的数字,你从 0 开始。
  • 你读入 9 并计算 (0*10)+9 -> 9
  • 你读入 7 并计算 (9*10)+7 -> 97
  • 你读取一个非数字,你输出 97。

  • 这是一个更完整的例子 s,10,100 :
  • 您从“准备读取命令状态”开始。
  • 你读“s”,“s”是命令。您切换到“准备阅读第一个逗号”状态。
  • 你读了第一个逗号,你就切换到“准备找出第一个参数的符号”状态。
  • 你读了一个数字。由于这不是“-”,因此第一个参数是正数。您将第一个数字设置为数字的值 1。您现在处于“读取第一个数字”状态。
  • 您读取了一个数字 0。您将第一个数字设置为 1*10+0 -> 10。您仍处于“读取第一个数字”状态。
  • 你读了一个逗号。您现在处于“准备找出第二个参数的符号”状态。
  • 你读到了 1。第二个数字是正数(因为这不是“-”)。您将第二个数字设置为 1。您处于“读取第二个数字”状态。
  • 您读取 0。第二个数字现在设置为 1x10+0 -> 10。您仍处于“读取第二个数字”状态。
  • 您读取 0。第二个数字现在设置为 10x10+0 -> 100。您仍处于“读取第二个数字”状态。
  • 你读到了行尾。你执行你的结果:命令是“s”,第一个数是正数,第一个数是10,第二个数是正数,第二个数是100。
  • 您切换回“准备读取命令”状态。
  • 关于Arduino 串行数据解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12161784/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com