Неверное преобразование из 'const char*' в 'char*' [-fpermissive]
С помощью WebSocket приходят различные сообщения.
Задача:
- Найти сообщение "setBrightness: 15"
- Извлеките значение "15" из сообщения (значение может быть любым)
- Преобразуйте это значение в uint8_t
Мой код:
#include <string.h>
String payload_str = "setBrightness: 15"; // Сообщение веб-сокета
const char* payload = payload_str.c_str(); // Преобразование строки в символ
const char* value; // Значение сообщения
uint8_t brightness;
void setup() {
Serial.begin(9600);
if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
value = strtok(payload, " ");
value = strtok(NULL," "); // Получить значение (15)
brightness = (uint8_t)atoi(value); // Преобразование в uint8_t
}
}
void loop() {}
Ошибка компиляции:
ошибка: неверное преобразование из 'const char*' в 'char*' [-fpermissive]
ошибка: инициализация аргумента 1 для 'char* strtok(char*, const char*)' [-fpermissive]
Возможно, я делаю это совершенно неправильно и небезопасно. Как это можно исправить?
@Delta, 👍0
1 ответ
Лучший ответ:
strtok
изменяет буфер символов, указанный в качестве первого параметра. Он заменяет разделители завершающими нулями. Чтобы проанализировать константную строку с помощью strtok
, вы должны сначала скопировать ее в рабочий буфер символов.
Для теста вы можете инициализировать массив символов, как показано в следующем примере.
char payload[] = "setBrightness: 15";
uint8_t brightness;
void setup() {
Serial.begin(9600);
if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
strtok(payload, " ");
const char* tok = strtok(NULL," "); // Получить значение (15)
brightness = (uint8_t) atoi(tok); // Преобразование в uint8_t
}
}
void loop() {}
если вы знаете часть "имя" в строке имя:значение, вы можете пропустить ее для atoi
следующим образом:
brightness = (uint8_t) atoi(payload + strlen("setBrightness: "));
(strlen("setBrightness: "
будет оцениваться во время компиляции как постоянное число)
const char payload[] = "setBrightness: 15";
uint8_t brightness;
void setup() {
Serial.begin(9600);
if(strncmp(payload, "setBri", 6) == 0) { // Поиск сообщения
brightness = (uint8_t) atoi(payload + strlen("setBrightness: ")); // Преобразование в uint8_t
}
}
void loop() {}
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Спасибо за помощь! Сегодня попробую и скажу результат., @Delta