Arduino的蓝牙模块收到的信息为啥乱码

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino的蓝牙模块收到的信息为啥乱码相关的知识,希望对你有一定的参考价值。

您收到的短信是乱码,一般有以下原因:
1.发送方用户 输入的格式不正 确;
2.接收方只能接收英文,而发送方发送的是中文;
3.网上发送的图片或下载的铃声,但手机不支持此格式。
参考技术A 应该是你的波特率设置有问题吧,或者接收的是中文??

如何拆分arduino代码中的数字?

【中文标题】如何拆分arduino代码中的数字?【英文标题】:How to split numbers in the arduino code? 【发布时间】: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

【问题讨论】:

欢迎来到 ***!请以文本形式发布Minimal Reproducible Example,最短的完整代码,显示您尝试过的内容。图像不太受欢迎(也没有用)。最好的方法是通过复制/粘贴,在您检查它确实表现出所描述的行为之后。我建议您使用tour 并阅读How do I ask a good question? 这些似乎都不是 C. 防火墙阻止我访问您的链接。没有代码发布为文本 == 没有帮助。 如有疑问: 1) 在互联网上搜索示例; 2) 在 PC 上编写一个程序来练习你的解决方案。在 PC 上进行开发通常比在嵌入式系统上进行调试更容易。 如果您可以使用尝试调试此问题时的信息更新您的问题,这将很有帮助。例如,App Inventor 使用Send1ByteNumberSendText 发送数据。您希望在变量readString 中打开 Arduino 的什么值?你实际上得到了什么数据? Serial.read 的文档说它只返回可用的传入串行数据的第一个字节。 【参考方案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 是为了让程序看到一个数字并以正确的字节发送到串行,但它可以是任何数字。 很高兴它对您有用。当我将文本框留空时,我看到了一个不同的错误。它不发送任何值,因为它不能将空值转换为整数。我已经用检查空字符串并将其替换为零的示例更新了上面的答案。正如您所说,这是“另一个问题”。在 *** 上,如果它回答了您的原始帖子,则预计您会完成此问题,如果有其他问题,请打开一个新问题。

以上是关于Arduino的蓝牙模块收到的信息为啥乱码的主要内容,如果未能解决你的问题,请参考以下文章

arduino的fc114蓝牙模块与iphone怎么配对

arduino蓝牙模块间怎么通讯

如何借助蓝牙模块使用 Android 手机控制 Arduino

Arduino上输入数字,蓝牙里为啥返回的是字母?

unity在安卓手机上使用蓝牙连接arduino蓝牙模块

Arduino蓝牙模块HC-06错误