Я пишу библиотеку Arduino для простой передачи данных между Arduino и компьютером, используя последовательный канал. Я создал библиотеку и т. Д. Однако у меня возникли проблемы с получением массива char и добавлением к нему двоеточия (‘:’). То есть,
//Sends data via println()
void simpleTransfer::sendData(char *name, char *data){
char *str = name + ": " + data + ",";
_serial->println(str); //Sends in form 'name: data,'
}
Это должно взять имя переменной, которую я хочу отправить, добавить двоеточие и пробел, данные, которые я хочу отправить, и, наконец, запятую. Однако вместо этого я получаю сообщения об ошибках:
недопустимые операнды типов «char *» и «const char [3]» для двоичного «оператора +»
Какова причина?
Вы могли бы использовать Sprintf:
char str[64]; // Or whatever length you need to fit the resulting string
sprintf(str, "%s:%s,", name, data);
Или же зЬгсру / strcat:
char str[64];
strcpy(str, name);
strcat(str, ":");
strcat(str, data);
strcat(str, ",");
Или просто используйте C ++ станд :: строка.
Краткий ответ: используйте std::string
создать объединенную строку.
std::string s = ((std::string(name) + ": ") + data) + ",";
_serial->println( s.c_str() );
Длинный ответ: при конкатенации строк в стиле C вам нужен целевой буфер, достаточно большой для хранения результата. Если вы знаете максимальный размер, к которому может прийти результат, вы можете объявить локальный массив этого размера и использовать sprintf
как объясняет другой ответ.
Или, если вы не знаете размер заранее, вы можете использовать комбинацию strlen
а также new[]
чтобы выделить динамический размер буфера, выполните печать, затем delete[]
буфер. Но не делай этого! Вместо этого используйте строковый класс std::string
или, как упоминает Дрю Дорманн в комментариях ниже, специфичный для Arduino String
учебный класс.