如何拆分arduino代码中的数字?
Posted
技术标签:
【中文标题】如何拆分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 使用Send1ByteNumber
和SendText
发送数据。您希望在变量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代码中的数字?的主要内容,如果未能解决你的问题,请参考以下文章