Преобразовать массив байтов в строку? Разработка прошивки ESP32 BLE - PullRequest
0 голосов
/ 21 июня 2019

Я использую приложение для 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 *}'

Ответы [ 2 ]

0 голосов
/ 25 июня 2019

Я думаю, что вы близки с вашим решением. Нужно мелкие исправления:

Первое исправление - объявить 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, чтобы увеличить MTU соединения BLE.

0 голосов
/ 25 июня 2019

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

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

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

#include <string>

Замечание Iне ставьте ".h" в конце строки, попробуйте это так

...