-4

我在分离使用 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。

我需要做什么?

这是我的应用程序发明者块: 在此处输入图像描述

这是我的应用发明设计师: 在此处输入图像描述

这是我使用“;”的arduino代码 作为分离器: 在此处输入图像描述

这是串行的结果: 在此处输入图像描述

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

最后,这里是使用“59”作为分隔符的 arduino 代码: 在此处输入图像描述

结果: 在此处输入图像描述

4

1 回答 1

0

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

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

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

在此处输入图像描述

我已将所有应用程序块放在这里以供参考,但关键块是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];

为了检查文本框是否为空并将其替换为默认值,我会执行以下操作: 在此处输入图像描述

于 2021-09-10T07:39:08.027 回答