将字节数组转换为字符串? 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。