【问题标题】:How to split numbers in the arduino code?如何拆分arduino代码中的数字?
【发布时间】:2021-11-02 01:35:09
【问题描述】:

我在分离使用 hc-06 蓝牙模块从我的应用程序发明者那里收到的号码时遇到了一些问题。 所以我的问题是应用程序发明者将所有内容一起发送,我需要拆分它们,但我不知道该怎么做。

我写信是为我的疑问添加一些信息,以便提供更多信息。

所以我的问题是我需要从应用程序发明者那里收到我的数字。该应用程序发送给我的序列号,例如数字 1、2、3、4、5、6。我为 A、B、C、D、E、F 创建了一个变量(INT);我想为每个数字拆分每个字母。然后我打印一些字母 (A),结果必须是第一个数字,在本例中为数字 1。 我已经创建了一个程序,但它不起作用,因为当我打印一些字母 (A) 时,它会显示所有数字 (1,2,3,4,5,6)。 在应用程序发明者中,我在文本框(数字)之间放置了一个分号,试图将它们分开,并使程序在 arduino 代码中更容易,但是当我用分号发送数字时,它会显示为数字 59。结果,连续显示:59,1,59,2,59,3,59,4,59,5,59,6。

我需要做什么?

这是我的应用程序发明者块: enter image description here

这是我的应用发明设计师: enter image description here

这是我使用“;”的 arduino 代码作为分离器: enter image description here

这是串行的结果: enter image description here

  • 我们可以看到分号等于 59。

最后,这里是使用“59”作为分隔符的 arduino 代码: enter image description here

结果: enter image description here

【问题讨论】:

  • 欢迎来到 StackOverflow!请以文本形式发布Minimal Reproducible Example,最短的完整代码,显示您尝试过的内容。图像不太受欢迎(也没有用)。最好的方法是通过复制/粘贴,在您检查它确实表现出所描述的行为之后。我建议您使用tour 并阅读How do I ask a good question?
  • 这些似乎都不是 C.
  • 防火墙阻止我访问您的链接。没有代码发布为文本 == 没有帮助。
  • 如有疑问: 1) 在互联网上搜索示例; 2) 在 PC 上编写一个程序来练习你的解决方案。在 PC 上进行开发通常比在嵌入式系统上进行调试更容易。
  • 如果您可以使用尝试调试此问题时的信息更新您的问题,这将很有帮助。例如,App Inventor 使用Send1ByteNumber 和SendText 发送数据。您希望在变量readString 中打开 Arduino 的什么值?你实际上得到了什么数据? Serial.read 的文档说它只返回可用的传入串行数据的第一个字节。

标签: c++ string arduino bluetooth app-inventor


【解决方案1】:

有很多方法可以做到这一点,但重要的是蓝牙链路的两端都了解正在发送的数据结构。

通常使用蓝牙,如果您有多个值,您会将数据打包到一个列表中,以便您可以有效地发送它们。然后,您将在链接的另一端解压缩它们。

我创建了一个小应用程序,其中包含我想要发送的四个值。整数值由滑块创建。

我已将所有应用程序块放在这里以供参考,但关键块是SendBytes。据我所知,我的滑块值介于 0 和 255 之间(适合一个字节),我可以发送四个字节列表中的所有四个值。

在链接的 Arduino 端,我将 readBytes 知道我的值在列表中的位置,因此我可以解压缩列表并将每个值从字节转换为整数。

#include <SoftwareSerial.h>

SoftwareSerial hc06(3,2);
const int BUFFER_SIZE = 4;
byte dataBytes[BUFFER_SIZE];

void setup(){
  //Initialize Serial Monitor
  Serial.begin(9600);
  //Initialize Bluetooth Serial Port
  hc06.begin(9600);
  Serial.println("setup done...");

}

void loop(){
  //Write data from HC06 to Serial Monitor
  if (hc06.available()){
    int data_len = hc06.readBytes(dataBytes, BUFFER_SIZE);
    int a = (int) dataBytes[0];
    int b = (int) dataBytes[1];
    int c = (int) dataBytes[2];
    int d = (int) dataBytes[3];
    Serial.print("A = ");
    Serial.println(a);
    Serial.print("B = ");
    Serial.println(b);
    Serial.print("C = ");
    Serial.println(c);
    Serial.print("D = ");
    Serial.println(d);
  }  
}

当我发送一些随机数据时,它在串行监视器中给了我以下输出:

setup done...
A = 221
B = 147
C = 58
D = 3

如果 255 不是一个足够大的数字,那么您可以使用两个字节 (UInt16) 达到 65,535。查看 App Inventor 似乎没有现成的方法可以将大整数转换为 UInt8 值数组。但是,进行转换并不是很多。举个例子:

Arduino 上的转换如下所示:

    int a = 0;
    int b = 0;
    lowByte(a) = dataBytes[0];
    highByte(a) = dataBytes[1];
    lowByte(b) = dataBytes[2];
    highByte(b) = dataBytes[3];

为了检查文本框是否为空并将其替换为默认值,我会执行以下操作:

【讨论】:

  • 嘿@ukBaz,它有效!你的帮助对我来说真的很重要,我很感激!但是现在,出现了另一个问题,因为这可以按照您所说的那样将字节拆分为字节,但是当我没有输入一些数字时,程序似乎忘记了这个字节并且没有按我想要的顺序排列.下面我写得更好以提供更多信息。
  • 这是我的图片,可以更好地解释发生了什么:i.stack.imgur.com/y1JMg.png ////////// i.stack.imgur.com/vGCx1.png 如您所见,在第一个中我没有写任何数字, 理论上它在序列上会以字母 A 的形式出现,但以字母 D 的形式出现。在这种情况下,序列必须是 A=0,B=2,C=3,D=4。为了解决我的问题,我在应用程序发明者上尝试了这段代码:i.stack.imgur.com/pmTCI.png。我的意图是:“如果我不在 text.box 上写数字,则将数字 88 放在文本框上”。但它不起作用,我认为这是类似的东西。
  • 我之所以放数字 88 是为了让程序看到一个数字并以正确的字节发送到串行,但它可以是任何数字。
  • 很高兴它对您有用。当我将文本框留空时,我看到了一个不同的错误。它不发送任何值,因为它不能将空值转换为整数。我已经用检查空字符串并将其替换为零的示例更新了上面的答案。正如您所说,这是“另一个问题”。在 stackoverflow 上,如果它回答了您的原始帖子,则预计您会完成此问题,如果有其他问题,请打开一个新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-05
  • 1970-01-01
  • 2015-05-20
相关资源
最近更新 更多