Arduino串口数据解析

2024-04-30

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

我的问题是,当我想解析 Arduino 上的轮速命令时,我必须解析最多 4 个分离bytes to int, 例如s,-100,-100让我的机器人全速后退,但我如何解析它以便我可以调用setSpeed(left, right); with leftand right等于-100?

我知道我可以单独分析每个字节并将它们放在一起以获得一个整数,但这不是很优雅,并且可能已经有更好的解决方案来解决所有这些问题,不幸的是我还没有找到它。

EDIT

这是我的 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 的效果如下:

  1. 你读入的数字没有前面的数字,你从 0 开始。

  2. 您读入 9 并计算 (0*10)+9 -> 9

  3. 你读入 7 并计算 (9*10)+7 -> 97

  4. 你读入一个非数字,输出 97。

这是一个更完整的例子s,10,100:

  1. 您从“准备读取命令状态”开始。

  2. 你读“s”,“s”就是命令。您切换到“准备阅读第一个逗号”状态。

  3. 当你读到第一个逗号时,你切换到“准备找出第一个参数的符号”状态。

  4. 你读到一个数字。由于这不是“-”,因此第一个参数是正数。您将第一个数字设置为数字值 1。您现在处于“正在读取第一个数字”状态。

  5. 你读取了一个数字,0。你将第一个数字设置为1*10+0 -> 10。你仍然处于“读取第一个数字”状态。

  6. 你读到了一个逗号。您现在处于“准备找出第二个参数的符号”状态。

  7. 您读到 1。第二个数字是正数(因为这不是“-”)。您将第二个数字设置为1。您处于“正在读取第二个数字”状态。

  8. 您读取到 0。第二个数字现在设置为 1x10+0 -> 10。您仍处于“正在读取第二个数字”状态。

  9. 您读取到 0。第二个数字现在设置为 10x10+0 -> 100。您仍处于“正在读取第二个数字”状态。

  10. 您读到了行尾。你执行你的结果:命令是“s”,第一个数字是正数,第一个数字是10,第二个数字是正数,第二个数字是100。

  11. 您切换回“准备读取命令”状态。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Arduino串口数据解析 的相关文章

  • 读取串行端口 - 忽略在一定时间内写入串行端口的部分数据

    我想定期读取串行端口上的数据和Arduino 所以本质上是这样的 读一读 Wait 读一读 Wait Take etc 我面临的问题是端口将缓冲其信息 因此一旦我调用等待函数 串行端口上的数据就会开始缓冲 等待函数完成后 我尝试再次读取数据
  • 如何通过蓝牙在Raspberry Pi 4和Arduino Nano BLE之间进行读写?

    我能够通过 Rpi4 的 bluepy 和 Arduino Nano BLE 的 ArduinoBLE h 连接 Raspberry Pi 4 和 Arduino Nano BLE 不幸的是 当我尝试从 Rpi4 写入 Arduino Na
  • Python自动选择串口(适用于Arduino)

    目前 Python 程序必须知道设备 Arduino 位于哪个端口 然后 Python 才能与设备进行通信 Problem 每当设备拔出并重新插入时 其 COM 端口都会发生变化 因此必须再次向 Python 提供正确的串行端口 以便它找到
  • sim800L GPRS 发布请求

    我一直在研究 LoNet 迷你 GSM 模块 SIM800L 并将其与 Arduino 连接 我已插入 SIM 移动卡并且可以连接互联网 通过串行监视器 我可以毫无问题地与它通信 但是当向网络服务器页面发出 GET 或 POST 请求时 它
  • ESP32 Arduino-ide如何获取唯一id

    我试图自动为每个 esp32 设置一个唯一的 id 在我使用提供该方法的 ESP IDF 框架对设备进行编程之前esp efuse mac get default 这将返回一个 8 字节值 该值在我手上的所有设备上都是唯一的 在arduin
  • Arduino 的 C++ 类文件中的字符串无法编译

    我正在用 C 为 Arduino 编写一个堆栈类sketch http www arduino cc en Tutorial Sketch 我相信它完全符合AVR 如果这就是它的名字 我记不清了 编译器 我都用过malloc and fre
  • Arduino - 高效地迭代 C 数组

    我有以下数组 PROGMEM prog uint16 t show hide info 4216 8900 4380 580 500 600 500 580 1620 580 500 600 500 580 500 600 480 600
  • C#读取Arduino

    我正在尝试制作一个从 Arduino 读取传出信号的应用程序 但我无法使其在 C 中工作Windows 窗体 http en wikipedia org wiki Windows Forms 仅在控制台中 我的 C Windows 窗体代码
  • 如何为 Arduino 或类似的微控制器编写 JavaScript 编译器? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我意识到这个问题会引起一些人的注意 并且我意识到 JavaScript 传统上是一种解释性语言 请让我解释一下 我是一名专门从事 We
  • SIM900 GSM/GPRS 未获得正确的 AT+CREG?回答

    我使用的是带有 IComsat SIM900 GSM GPRS 扩展板的 Arduino UNO 使用以下教程 Arduino 实时 GPS 追踪器 http www samaria me uk 2011 12 arduino live g
  • Arduino C++ 析构函数?

    我知道在Arduino中你不能使用delete 那么什么时候调用 C 类中定义的析构函数呢 同样 如果我想创建一个指向数组的指针 我必须使用malloc and free 当对象被销毁时 析构函数被调用 对于自动 堆栈上 变量 它在离开其作
  • 编译器:如果条件始终为真/假怎么办

    我想到了条件和编译器 我正在为 Arduino 编写一个应用程序 因此我需要该应用程序尽可能快 在我的代码中我有这个 define DEBUG false if DEBUG String pinName pinName Pin pinNam
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值
  • 如何在 Arduino 中将 char 变量作为数字打印到串行端口?

    我正在使用 Arduino Uno 我正在从 EEPROM 读取一个字节值并将该值存储在类型变量中char 1 字节 我想将变量的值作为数字 而不是相应的 ASCII 代码 打印到串行监视器 例如考虑char val 5 我想查看串行监视器
  • Arduino CLI 编译器“ino”和一些基本草图导致编译错误

    我正在尝试使用 cli 编译器 ino 编译基本的以太网 UDP Sketch 我从他们的 github 存储库下载了最新版本 ino init然后是 src sketch ino 的内容 include
  • 是否值得为 EEPROM 实现小型文件系统

    我买了一个I2C EEPROM 我想存储传感器和电压数据 我假设该值可以大于一个字节 并且可以有很多数据 在这种情况下是否值得实现具有小文件分配表的文件系统 例如 这会让我更容易查看 EEPROM 我发现 EEPROM 上出现 FAT 有两
  • 无法访问超过 255 个的 Modbus 寄存器 SimpleModbus

    我是法国学生 我已经使用 SimpleModbus 1 周了 它工作得很好 直到我尝试实现一个具有大量寄存器 1000needed 使用从站 1 无法访问超过 255 个的寄存器 无论我做什么 一旦寄存器读数超过 255 我就会收到超时错误
  • Arduino 上的串行消息到整数

    我希望我的 Arduino 通过串行通信接收一个整数 你能帮我解决这个问题吗 它应该是这样的形式 int value strtoint Serial read 有多种方法可以读取整数Serial 很大程度上取决于数据发送时的编码方式 Ser
  • Arduino 引导加载程序

    有人可以解释一下如何Arduino引导加载程序 http code google com p arduino source browse tags 0019 hardware arduino bootloaders atmega ATmeg
  • 多次客户端打印后,Arduino (Uno) 以太网客户端连接失败

    我正在使用带有以太网扩展板的 Arduino Uno 发送多次 HTTP 请求后 客户端 println 客户端连接时开始失败 故障时间似乎是随机的 并且循环中的序列读数可能在 1000 和 7000 之间变化 该错误与以太网发送缓冲区溢出

随机推荐

  • android studio 错误:缺少功能:WATCH

    我尝试在我的智能手表上使用 android studio 运行一个简单的应用程序 并收到以下消息 我的智能手表运行 Android 4 4 2 其 API 级别为 19 我尝试过但没有帮助的事情 将最低 SDK 版本更改为 API 19 r
  • 如何替换 NSString 中的 \xA0 字符

    以下代码不起作用 NSString importText textView string stringByReplacingOccurrencesOfString xA0 xA0 withString 编译器声明 由于输入字节不属于输入代码
  • IIS7 权限概述 - ApplicationPoolIdentity

    我们最近升级到 IIS7 作为核心 Web 服务器 我需要一个权限方面的概述 以前 当需要写入文件系统时 我会授予 AppPool 用户 网络服务 对目录或文件的访问权限 在 IIS7 中 我看到默认情况下 AppPool 用户设置为App
  • 什么是 .tpl 文件? PHP、网页设计

    有人希望我重新设计一个用 PHP VideoCMS 运行的网站 但是当我要求他向我发送源代码时 他给了我 tpl 文件而不是 php 其中有一些代码 include file header tpl p article br table wi
  • 使用 ProGuard 对 Android 代码进行混淆...如何知道它已被混淆?

    我有一个 Android 项目 最近通过 ProGuard 进行混淆运行后发布到市场 该项目导出时没有任何复杂性 但我怎么知道它已被混淆 我可以做些什么来验证混淆是否成功 寻找dump txt mapping txt seeds txt a
  • OpenSubKey 不适用于我需要的注册表值

    我安装了 SQL Server In the registry the key MSSQLServer at HKEY LOCAL MACHINE SOFTWARE Microsoft looks like this 以下所有代码行都从注册
  • CoAP 和 DTLS 集成

    我实现了 CoAP libcoap 和 DTLS tinyDTLS 的实现 如何将 CoAP libcoap 与 DTLS tinyDTLS 集成 我将不胜感激任何建议 libcoap 现在完全支持这一点 当您使用其子模块构建它时 git
  • 从查找文件中批量重命名部分文件名

    edit 请参阅底部以了解我的最终解决方案 我有一个包含约 12 700 个文本文件的目录 他们的名字是这样的 1 Re Report Novenator 公开呼吁埋葬 Lizbett 星期四 2009 年 9 月 10 日 txt 其中前
  • 当手机进入睡眠/待机模式时,活动/服务会发生什么?

    当手机 AP进入睡眠模式时 Android应用程序以及属于应用程序的活动和服务会发生什么 框架会破坏活动和服务并且操作系统会杀死进程吗 如果设备处于睡眠状态 将调用 Activity 的 onPause 读活动生命周期 http devel
  • python matplotlib 无边框表格

    我在表格顶部有一个由以下示例生成的图 表格数据被随机数替换 实际绘图被一些任意函数替换 import numpy as np import matplotlib pylab as plt fig ax plt subplots ntp 17
  • python 拆分而不创建空白

    我明白为什么使用 split 创建空白很重要 这要归功于这个问题 https stackoverflow com questions 2197451 why are empty strings returned in split resul
  • 如何使用 Linq to SQL 从存储过程中检索多行?

    我最近开始使用 Linq to SQL 想知道如何通过执行存储过程来获取多行 这是我想要使用的一个简单的 sp CREATE PROCEDURE gsp ftsmultiple SearchKey varchar 100 AS BEGIN
  • 根据另一行中另一列的值将列添加到数据框

    我正在寻找我的具体问题的答案 但没有找到结论 我找到了这个 根据其他列的值将列添加到数据框 https stackoverflow com questions 26067161 add column to data frame based
  • C++ GetDIBits 不工作

    首先我加载图像 cool bmp 加载很好 然后我调用函数 getPixArray 但它失败了 case WM CREATE runs once on creation of window hBitmap HBITMAP LoadImage
  • C# 中的时间跨度总和

    我有一个包含 TimeSpan 变量的对象集合 MyObject TimeSpan TheDuration get set 我想使用 LINQ 来计算这些时间的总和 当然 从 MyCollection 中的 r 选择 r TheDurati
  • javascript - 如何防止 toFixed 对小数进行四舍五入

    我对 html javascript 和 css 很陌生 所以如果我的问题对你来说听起来很愚蠢 请原谅 我的问题是如何阻止该功能toFixed 来自小数的四舍五入 这是我的链接 http jsfiddle net RWBaA 4 http
  • Xcode 7 UI 测试:如何在代码中消除一系列系统警报

    我正在使用新的 Xcode 7 UI 测试功能编写 UI 测试用例 在我的应用程序的某个时刻 我会请求用户允许相机访问和推送通知 所以会出现两个 iOS 弹出窗口 MyApp Would Like to Access the Camera
  • Laravel 5:先发送响应,然后在控制器中处理请求

    我正在使用 Classic Paypal API 但在处理请求数据之前遇到了响应问题 public function store Send an empty HTTP 200 OK response to acknowledge recei
  • CCAvenue iOS 套件集成套件

    我正在尝试将 CCAvenue 支付集成集成到 iOS 中 他们给了我两个库文件 名为 libcrypto a and libssl a 他们还给了我一些头文件 为了实现这一点 他们提到我应该在构建设置中设置标头搜索路径和库搜索路径 我已经
  • Arduino串口数据解析

    我正在编写一个应用程序 通过蓝牙用我的 Android 手机控制我的机器人 一切都很顺利 数据得到回显和验证 但我在协议方面遇到了一些问题 特别是我希望我的机器人的轮子在我发送时转动一个命令 例如s 10 100 or s 30 10 数值