Разбить строку char[] с символами разделителями на отдельные числа

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Всем доброго дня. Помогите, пожалуйста, как мне разбить строку char[] без ардуиновского String. Мы принимаем пo Serial строку типа 10;153;10;135;OE;Её нужно разобрать на отдельные числа через atoi.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Как Вам помочь? Где Ваш код? Что именно у Вас не получается?

rkit
Offline
Зарегистрирован: 23.11.2016

strtok
sscanf

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Мы через Serial.readBytes принимаем в буфер строку. В ней через точку с запятой находятся числа. Их нужно оттуда получить и записать в отдельные переменные. Я не знаю как это реализовать без ардуиновской встроенной библиотеки String. Вот прошу помощи.

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

Так код-то Ваш где? 

Или нет никакого кода? А как тогда Вам помогать? Скажите толком какой именно помощи Вы ждёте. Конкретно.

arduino not my
arduino not my аватар
Offline
Зарегистрирован: 28.10.2020

Все, разобрался.Всем спасибо.

char inData[25] = "125;242;1684;48";                //Input data
char symbol[10] = ";";
char *istr;

void setup() {
  Serial.begin(9600);
    istr = strtok (inData,symbol);
   while (istr != NULL){
      Serial.println(istr);
      istr = strtok (NULL,symbol);
   }
}

void loop() {}

 

ЕвгенийП
ЕвгенийП аватар
Offline
Зарегистрирован: 25.05.2015

А 10-то во второй строке нафига?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

arduino not my пишет:

Мы через Serial.readBytes принимаем в буфер строку. В ней через точку с запятой находятся числа. Их нужно оттуда получить и записать в отдельные переменные. Я не знаю как это реализовать без ардуиновской встроенной библиотеки String.

Ну, вообще говоря, реализовать можно в точности так, как Вы написали. Просто представьте, что строку разбирает не микроконтроллер, а Вы сами. Подробно распишите алгоритм, что и как Вы будете делать, чтобы справиться с этой задачей. По русски. А потом останется только перевести на Си.

Беда, правда, в том, что описанный Вами алгоритм весьма неоптимален и может даже приводить в некоторых случаях к полной неработоспособности программы. Гораздо лучше не складывать принимаемые символы в буфер, а сразу разбирать строку посимвольно по мере получения из Serial. 

b707
Offline
Зарегистрирован: 26.05.2017

arduino not my пишет:

Все, разобрался.Всем спасибо.

char inData[25] = "125;242;1684;48";                //Input data
char symbol[10] = ";";
char *istr;

void setup() {
  Serial.begin(9600);
    istr = strtok (inData,symbol);
   while (istr != NULL){
      Serial.println(istr);
      istr = strtok (NULL,symbol);
   }
}

void loop() {}

 

судя по коду не "разобрался", а "нашел готовое и списал".

Зачем в первой строке 25 символов, зачем во второй 10, к чему тут цикл while(), зачем переписывать указатель instr на NULL ? - уверен, что ни на один из этих вопросов вы не ответите

vlad072
Offline
Зарегистрирован: 01.08.2017
char str[20] = "125;242;1684;48";
int n[10] = {0};
 
//===============================
  char* ptr = str; int sz = 0;
  do {
    if ( !isdigit(ptr[0]) ) break;
    n[sz++] = atoi(ptr);    
  } while ( (ptr = strchr(ptr, ';')+1) != 1 );
//===============================

В sz будет количество заполенных элементов массива n