将串行输入读入字符数组
Read Serial Input into Char Array
所以我已经设法将 ESP-01 模块连接到我的 arduino,现在我正在尝试解析芯片通过串行连接给出的 +IPD 响应。我对 C++ 并不是那么得心应手,但这是我在网上研究了一堆之后设法想出的:
#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
int baud = 9600;
void setup() {
ESP8266.begin(baud);
Serial.begin(baud);
Serial.println("--- Start ---");
}
void loop() {
if (ESP8266.available()) // check if the esp is sending a message
{
Serial.println("Something received");
delay(500);
if (ESP8266.find("%<"))
{
Serial.println("--------------- DEBUG ----------------A");
char temp = {char(ESP8266.read())};
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
temp = char(ESP8266.read());
}
Serial.println("\n--------------- END DEBUG ----------------");
}
}
}
芯片收到消息时的标准响应如下:
+IPD,<len>:<Message>
+IPD,0,14:%<255,128,0%
我正在尝试发送的数据 - 随机 RGB 值(使用“%<”和“%”作为 flags/markers):
%<255,128,0%
从这里开始,我成功地编写了上面的代码,它将通过串行打印出以下内容:
所以我设法让它通过 Serial 打印我需要的值,但我似乎无法将它们存储在某种数组中以处理数据。
我尝试过的事情:
- 使用 readString() 而不是 read(),结合 indexOf 到 search/extract 数据
- 循环并附加到字符数组
- 一堆数组的东西,虽然看起来很棘手,因为你必须知道声明它的长度
理想情况下,我想要一个读取 +IPD 值、提取 RGB 数据然后将其拆分为 3 索引数组的函数,如下所示:
rgbArray = {124, 234, 96};
非常感谢任何帮助!
要将输入存储到数组中,只需分配一个数组并将数据存储在那里。
Serial.println("--------------- DEBUG ----------------A");
int receivedLength = 0;
char data[16];
char temp = ESP8266.available();
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
if (receivedLength < 16) data[receivedLength++] = temp;
}
for (int i = 0; i < receivedLength; i++) Serial.print(data[i]);
Serial.println("\n--------------- END DEBUG ----------------");
或者,您可以在阅读时转换为整数:
Serial.println("--------------- DEBUG ----------------A");
int rgbSize = 0;
int rgbArray[3];
int currentValue = 0;
char temp = ESP8266.available();
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
if (temp == ',') {
if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
currentValue = 0;
} else {
currentValue = currentValue * 10 + (temp - '0');
}
}
if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
for (int i = 0; i < rgbSize; i++) {
if (i > 0) Serial.print(',');
Serial.print(rgbArray[i]);
}
Serial.println("\n--------------- END DEBUG ----------------");
最终采用了不同的做事方式:
成功阅读了 readStringUntil('');在网络的某个黑暗角落。所以我想出了一个超级肮脏的实现 - 但它有效:
假设您的输入字符串是:
+IPD,0,14:%<255,128,0%
然后做:
if (ESP8266.available()) // check if the esp is sending a message
{
delay(500);
if (ESP8266.find("%<"))
{
r = ESP8266.readStringUntil(',');
g = ESP8266.readStringUntil(',');
b = ESP8266.readStringUntil('%');
}
}
所以我已经设法将 ESP-01 模块连接到我的 arduino,现在我正在尝试解析芯片通过串行连接给出的 +IPD 响应。我对 C++ 并不是那么得心应手,但这是我在网上研究了一堆之后设法想出的:
#include <SoftwareSerial.h>
SoftwareSerial ESP8266(2, 3); // RX | TX
int baud = 9600;
void setup() {
ESP8266.begin(baud);
Serial.begin(baud);
Serial.println("--- Start ---");
}
void loop() {
if (ESP8266.available()) // check if the esp is sending a message
{
Serial.println("Something received");
delay(500);
if (ESP8266.find("%<"))
{
Serial.println("--------------- DEBUG ----------------A");
char temp = {char(ESP8266.read())};
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
temp = char(ESP8266.read());
}
Serial.println("\n--------------- END DEBUG ----------------");
}
}
}
芯片收到消息时的标准响应如下:
+IPD,<len>:<Message>
+IPD,0,14:%<255,128,0%
我正在尝试发送的数据 - 随机 RGB 值(使用“%<”和“%”作为 flags/markers):
%<255,128,0%
从这里开始,我成功地编写了上面的代码,它将通过串行打印出以下内容:
所以我设法让它通过 Serial 打印我需要的值,但我似乎无法将它们存储在某种数组中以处理数据。
我尝试过的事情:
- 使用 readString() 而不是 read(),结合 indexOf 到 search/extract 数据
- 循环并附加到字符数组
- 一堆数组的东西,虽然看起来很棘手,因为你必须知道声明它的长度
理想情况下,我想要一个读取 +IPD 值、提取 RGB 数据然后将其拆分为 3 索引数组的函数,如下所示:
rgbArray = {124, 234, 96};
非常感谢任何帮助!
要将输入存储到数组中,只需分配一个数组并将数据存储在那里。
Serial.println("--------------- DEBUG ----------------A");
int receivedLength = 0;
char data[16];
char temp = ESP8266.available();
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
if (receivedLength < 16) data[receivedLength++] = temp;
}
for (int i = 0; i < receivedLength; i++) Serial.print(data[i]);
Serial.println("\n--------------- END DEBUG ----------------");
或者,您可以在阅读时转换为整数:
Serial.println("--------------- DEBUG ----------------A");
int rgbSize = 0;
int rgbArray[3];
int currentValue = 0;
char temp = ESP8266.available();
while ((temp != '%') && (ESP8266.available())) {
Serial.print(temp);
if (temp == ',') {
if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
currentValue = 0;
} else {
currentValue = currentValue * 10 + (temp - '0');
}
}
if (rgbSize < 3) rgbArray[rgbSize++] = currentValue;
for (int i = 0; i < rgbSize; i++) {
if (i > 0) Serial.print(',');
Serial.print(rgbArray[i]);
}
Serial.println("\n--------------- END DEBUG ----------------");
最终采用了不同的做事方式:
成功阅读了 readStringUntil('');在网络的某个黑暗角落。所以我想出了一个超级肮脏的实现 - 但它有效:
假设您的输入字符串是:
+IPD,0,14:%<255,128,0%
然后做:
if (ESP8266.available()) // check if the esp is sending a message
{
delay(500);
if (ESP8266.find("%<"))
{
r = ESP8266.readStringUntil(',');
g = ESP8266.readStringUntil(',');
b = ESP8266.readStringUntil('%');
}
}