将字节数组转换为字符串? ESP32 BLE固件开发
Convert byte array to string? ESP32 BLE firmware development
我正在使用一个 android 应用程序(移动 phone)和一个 ESP32,它们通过 BLE 相互连接。我正在尝试从手机 phone 向 ESP32 发送一个字符串。 android 应用程序发送字节数组形式的字符串,esp 接收它。但是我无法检索 ESP 固件上的值。
下面是我尝试过的方法的代码。这段代码的重点是将从 android 应用程序发送的字符串存储在这个变量中:INCOMING_STRING1
。我尝试将接收变量设置为字符数组(我认为这就是该变量的用途),然后使用 strcpy
假设传入数据的内容(通过字符参数传入)将被复制到INCOMING_STRING1
,然而,它不起作用。
//Variables
const uint8_t *character;
char INCOMING_STRING1[64];
//Elsewhere in code...
//event comes from the ESP BLE module when a BLE event happens
switch(event)
{
case ESP_GATTS_WRITE_EVT:
writeHandle(param->write.handle);
break;
...
}
//Elsewhere in code...
static void writeHandle(uint16_t handle)
{
get_attr_ret = esp_ble_gatts_get_attr_value(handle, &length, &character);
//There's different handles for different "channels"
if(handle == 45)
{
//supposed to take string that was received
strcpy(INCOMING_STRING1, character);
//then print it to make sure
printf("%s", INCOMING_STRING1);
}
}
我知道这可能是类型未匹配,因为传入数据的类型是 uint8_t
,而存储字符串的变量是类型 char
。一般来说,我一直在努力进行类型转换和类型操作,感谢您的帮助!
这是我此时收到的错误消息:
error: pointer targets in passing argument 2 of 'strcpy' differ in
signedness [-Werror=pointer-sign]
strcpy(INCOMING_STRING1, character);
^
note: expected 'const char * restrict' but argument is of type 'const uint8_t * {aka const unsigned char *}'
你试过这种方法吗?
//supposed to take string that was received
strcpy(INCOMING_STRING1.c_str(), character);
它是一种简单的转换方法,如果你不在 arduino 上,你可能想要包含字符串库 IDE。
#include <string>
注意我没有把“.h”放在字符串的末尾,这样试试
我认为您已接近解决方案。它需要进行小的修复:
第一个解决方法是以不同方式声明 character
:
const char *character;
uint8_t
是无符号字节,char
通常是有符号字节(不幸的是实现定义)。
第二个问题是传输的字符串很可能不是以 0 字节结尾的。所以你不能使用 strcpy
并且必须自己添加 0 字节。所以不是 strcpy
:
memcpy(INCOMING_STRING1, character, length);
INCOMING_STRING1[length] = 0;
另一个潜在的问题是字符串的长度。默认情况下,Android BLE 将仅传输有效载荷最多为 20 字节的消息。如果字符串较长,则在多个消息中传输。所以每次调用esp_ble_gatts_get_attr_value
,你只会得到一段字符串
所以从小字符串开始你的测试。如果您 运行 遇到较长字符串的问题,请更改 Android 代码以增加 BLE 连接的 MTU。
我正在使用一个 android 应用程序(移动 phone)和一个 ESP32,它们通过 BLE 相互连接。我正在尝试从手机 phone 向 ESP32 发送一个字符串。 android 应用程序发送字节数组形式的字符串,esp 接收它。但是我无法检索 ESP 固件上的值。
下面是我尝试过的方法的代码。这段代码的重点是将从 android 应用程序发送的字符串存储在这个变量中:INCOMING_STRING1
。我尝试将接收变量设置为字符数组(我认为这就是该变量的用途),然后使用 strcpy
假设传入数据的内容(通过字符参数传入)将被复制到INCOMING_STRING1
,然而,它不起作用。
//Variables
const uint8_t *character;
char INCOMING_STRING1[64];
//Elsewhere in code...
//event comes from the ESP BLE module when a BLE event happens
switch(event)
{
case ESP_GATTS_WRITE_EVT:
writeHandle(param->write.handle);
break;
...
}
//Elsewhere in code...
static void writeHandle(uint16_t handle)
{
get_attr_ret = esp_ble_gatts_get_attr_value(handle, &length, &character);
//There's different handles for different "channels"
if(handle == 45)
{
//supposed to take string that was received
strcpy(INCOMING_STRING1, character);
//then print it to make sure
printf("%s", INCOMING_STRING1);
}
}
我知道这可能是类型未匹配,因为传入数据的类型是 uint8_t
,而存储字符串的变量是类型 char
。一般来说,我一直在努力进行类型转换和类型操作,感谢您的帮助!
这是我此时收到的错误消息:
error: pointer targets in passing argument 2 of 'strcpy' differ in signedness [-Werror=pointer-sign] strcpy(INCOMING_STRING1, character); ^ note: expected 'const char * restrict' but argument is of type 'const uint8_t * {aka const unsigned char *}'
你试过这种方法吗?
//supposed to take string that was received
strcpy(INCOMING_STRING1.c_str(), character);
它是一种简单的转换方法,如果你不在 arduino 上,你可能想要包含字符串库 IDE。
#include <string>
注意我没有把“.h”放在字符串的末尾,这样试试
我认为您已接近解决方案。它需要进行小的修复:
第一个解决方法是以不同方式声明 character
:
const char *character;
uint8_t
是无符号字节,char
通常是有符号字节(不幸的是实现定义)。
第二个问题是传输的字符串很可能不是以 0 字节结尾的。所以你不能使用 strcpy
并且必须自己添加 0 字节。所以不是 strcpy
:
memcpy(INCOMING_STRING1, character, length);
INCOMING_STRING1[length] = 0;
另一个潜在的问题是字符串的长度。默认情况下,Android BLE 将仅传输有效载荷最多为 20 字节的消息。如果字符串较长,则在多个消息中传输。所以每次调用esp_ble_gatts_get_attr_value
,你只会得到一段字符串
所以从小字符串开始你的测试。如果您 运行 遇到较长字符串的问题,请更改 Android 代码以增加 BLE 连接的 MTU。