Преобразовать байтовый массив в строку? Разработка прошивки ESP32 BLE

Я использую приложение для Android (мобильный телефон) и ESP32, подключенные друг к другу через BLE. Я пытаюсь отправить строку с мобильного телефона на 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. Я всегда боролся с приведением типов и манипуляциями с типами в целом, любая помощь приветствуется!

Вот сообщения об ошибках, которые я получаю сейчас:

ошибка: цели указателя при передаче аргумента 2 'strcpy' отличаются подписью [-Werror = указатель-знак] strcpy (INCOMING_STRING1, символ); ^ примечание: ожидается 'const char * restrict', но аргумент имеет тип 'const uint8_t * {aka const unsigned char *}'


person phantomBlurrr    schedule 21.06.2019    source источник


Ответы (2)


Думаю, вы близки к своему решению. Требуются мелкие исправления:

Первое исправление - объявить character иначе:

const char *character;

uint8_t - это байт без знака, char - обычно байт со знаком (к сожалению, это определено в реализации).

Вторая проблема заключается в том, что передаваемая строка, скорее всего, не заканчивается нулевым байтом. Таким образом, вы не можете использовать strcpy и должны сами добавить 0 байт. Итак, вместо strcpy:

memcpy(INCOMING_STRING1, character, length);
INCOMING_STRING1[length] = 0;

Еще одна потенциальная проблема - это длина строки. По умолчанию Android BLE передает только сообщения с полезной нагрузкой до 20 байт. Если строка длиннее, передается в нескольких сообщениях. Таким образом, каждый раз, когда вы вызываете esp_ble_gatts_get_attr_value, вы получаете только кусок строки.

Так что начните свои тесты с маленьких строк. Если вы столкнулись с проблемой с более длинными строками, измените свой код Android, чтобы увеличить MTU соединения BLE.

person Codo    schedule 25.06.2019
comment
Привет @Codo, спасибо за ответ, к сожалению, get_attr_ret = esp_ble_gatts_get_attr_value (handle, & length, & character); требует, чтобы символьный аргумент имел тип uint8_t - person phantomBlurrr; 27.06.2019
comment
Затем вы должны привести аргумент либо в memcpy(INCOMING_STRING1, (const char*)character, length);, либо в esp_ble_gatts_get_attr_value(handle, &length, &(const uint8_t**)character); - person Codo; 27.06.2019

Вы пробовали этот способ?

//supposed to take string that was received
strcpy(INCOMING_STRING1.c_str(), character);

это простой метод преобразования, вы можете включить библиотеку строк, если вы не используете Arduino IDE.

#include <string>

Обратите внимание, что я не поставил ".h" на конец строки, попробуйте так

person Nathan Almeida    schedule 25.06.2019
comment
Привет, @Nathan Almeida, к сожалению, проблема #include ‹string› не может быть решена: / - person phantomBlurrr; 27.06.2019