将字节数组转换为字符串? ESP32 BLE固件开发

时间:2019-06-21 16:12:10

标签: arrays string bluetooth-lowenergy esp32 bluetooth-gatt

我正在使用通过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 *}'

2 个答案:

答案 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。