Загрузка данных


#include <zephyr/kernel.h>
#include <string.h>
#include <stdio.h>

/**
 * @brief Находит текст между маркером и концом строки.
 * 
 * @param src Исходная строка для поиска.
 * @param start_str Маркер, после которого нужно забрать текст.
 * @param out_buf Буфер для сохранения результата.
 * @param out_size Размер выходного буфера.
 * @return 0 при успехе, -1 если маркер не найден.
 */
int get_text_until_newline(const char *src, const char *start_str, 
                           char *out_buf, size_size out_size) {
    // 1. Ищем начало вхождения маркера
    char *start_ptr = strstr(src, start_str);
    if (!start_ptr) {
        return -1; // Маркер не найден
    }

    // 2. Смещаемся на длину самого маркера
    start_ptr += strlen(start_str);

    // 3. Ищем перевод строки (\n) или конец строки (\0)
    char *end_ptr = strchr(start_ptr, '\n');
    
    // Определяем длину извлекаемого текста
    size_t len = end_ptr ? (size_t)(end_ptr - start_ptr) : strlen(start_ptr);

    // Убираем \r, если он есть перед \n (для Windows-style окончаний)
    if (len > 0 && start_ptr[len - 1] == '\r') {
        len--;
    }

    // 4. Копируем результат в буфер с учетом размера
    if (len >= out_size) {
        len = out_size - 1;
    }
    
    strncpy(out_buf, start_ptr, len);
    out_buf[len] = '\0'; // Обязательно закрываем строку

    return 0;
}

int main(void) {
    const char *data = "Status: OK\r\nVersion: 1.2.3\nPayload: data";
    char result[32];

    if (get_text_until_newline(data, "Version: ", result, sizeof(result)) == 0) {
        printk("Found text: [%s]\n", result); // Выведет:
    } else {
        printk("Marker not found\n");
    }

    return 0;
}