我正在使用通过BLE彼此连接的android应用程序(手机)和ESP32。我正在尝试从手机发送一个字符串到ESP32。 android应用程序以字节数组形式发送字符串,并且esp接收到它。但是我在检索ESP固件上的值时遇到了麻烦。
下面是我尝试的方法的代码。这段代码的全部重点是将从android应用发送的字符串存储在以下变量中:INCOMING_STRING1
。我尝试将接收变量设置为字符数组(我认为这就是该变量的作用),然后使用strcpy
假定传入数据的内容(通过character参数传递)将复制到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
。一般来说,我一直在进行类型转换和类型操作方面的工作,一直很感激!
这是我此时收到的错误消息:
错误:“ strcpy”的传递参数2中的指针目标不同 签名[-Werror = pointer-sign] strcpy(INCOMING_STRING1,字符); ^ 注意:预期为'const char * strict',但参数的类型为'const uint8_t * {aka const unsigned char *}'
答案 0 :(得分:0)
您尝试过这种方式吗?
//supposed to take string that was received
strcpy(INCOMING_STRING1.c_str(), character);
它是一种简单的转换方法,如果您不在arduino IDE上,则可能要包含字符串库。
#include <string>
请注意,我没有在字符串末尾添加“ .h”,请尝试这种方式
答案 1 :(得分:0)
我认为您已经接近解决方案。它需要进行一些较小的修复:
第一个解决方法是用不同的方式声明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。