Разделение Serial.readString на массив строк
Я работаю над проектом, в котором мне нужно разделить входящие данные из последовательных (точнее, по времени, то есть aa:bb:cc) и разделить их на aa, затем на bb и cc, в идеале — на массив. Я знаю, что мог бы использовать readStringUntil и создать три отдельные переменные, но я бы предпочел, чтобы это было в массивах. Вот код, который должен это сделать. Он работает с предопределенной строкой (например, 00:00:00), но при чтении серийного номера сообщает, что инициализатору не удается определить размер «ввода». Заранее благодарим за полезные предложения.
Вот код:
void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN>(leds, NUM_LEDS);
Serial.begin(9600);
while(!Serial.available()){} //ждём получения последовательных данных
String vst = Serial.readString();
char buf[vst.length()+1];
vst.toCharArray(buf, vst.length());
char input[] = vst;
char delic[] = ":";
char* sub = strtok(input, delic);
while(sub != NULL){
Serial.println(ptr);
sub = strtok(NULL, delic);
}
@kuskus, 👍0
Обсуждение1 ответ
Лучший ответ:
Ваша главная проблема заключается в следующем:
char buf[vst.length()+1];
Вы не можете инициализировать массив возвращаемым значением функции.
Вместо этого вам нужно будет использовать alloca
для выполнения той же функции:
char *buf = alloca(vst.length()+1);
Однако то, как вы это делаете, расточительно. Вам вообще не нужен buf
. Вы можете напрямую обращаться к внутреннему буферу char
и манипулировать им внутри строки, используя vst.c_str();
.
Для удобства вы можете указать на него buf
:
char *buf = vst.c_str();
Для полноты картины приведем процедуру, которая принимает строку и выдает три целых числа. Поскольку мы ожидаем определенный формат, состоящий всего из трех разделов, нам действительно не нужен цикл.
// Используйте readStringUntil, чтобы избежать задержки в 1 секунду.
String vst = Serial.readStringUntil('\n');
char *buf = vst.c_str();
char *hourString = strtok(buf, ":");
char *minuteString = strtok(NULL, ":");
char *secondString = strtok(NULL, ":");
if (secondString != NULL) { // Будет истинно, только если у нас есть два двоеточия
int hours = atoi(hourString);
int minutes = atoi(minuteString);
int seconds = atoi(secondString);
Serial.print("It is ");
Serial.print(minutes);
Serial.print(" and ");
Serial.print(seconds);
Serial.print(" seconds past ");
Serial.println(hours);
} else {
Serial.println("Invalid time format");
}
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Как преобразовать строку в массив байтов
- Проблемы с преобразованием byte[] в String
- Как отправить строку с подчиненного устройства Arduino с помощью SPI?
- Понимание того, почему следует избегать «String» и альтернативных решений
- Чтение строки, разделенной запятыми
- Arduino: как записать значение переменной в текстовый файл и изменить его на SD-карте?
Вместо
vst.toCharArray()
(который копирует данные) просто используйтеvst.c_str()
, который уже является массивом символов. Вам не нуженbuff
, @Majenko