Отсечь от строки несколько первых символов

itehno
Offline
Зарегистрирован: 18.04.2015

Добрый день.

Я хочу отправить в Serial.port команду вида: RGB:R

Мне нужно, что бы отсеклась RGB: и в некую переменную записалось R

Покажите, пожалуйста, простейшим примером, как это делать. Всю голову уже сломал.

asam
asam аватар
Offline
Зарегистрирован: 12.12.2018

Почитайте про массивы в С/С++

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

itehno пишет:

Мне нужно, что бы отсеклась RGB: и в некую переменную записалось R ... Всю голову уже сломал.

Вы завязывайте голову ломать. Есть только две вещи, от которых у нормального мужика может сломаться голова и тривиальной задачки про массив среди этих вещей не значится.

Выпишите свою строку на клетчатой бумаге (по одному символу в клетке) и делайте, что Вам посоветовал коллега постом выше. Озарение придёт через минуту - другую.

itehno
Offline
Зарегистрирован: 18.04.2015

Добрый день. Я последовал Вашим советам и "загнал" строку в массив. Вот пример моего кода:

String input_string = "";

void setup() {
Serial.begin(9600);
}

void loop() {
str_to_char();
}

void str_to_char(){
  while (Serial.available() > 0) {
    char c = Serial.read();
    if ((c == 10) || (c == 13)){ 
        str_to_char();
        Serial.print("Input_string is: ");
        Serial.println(input_string);
    char charBuf[50];
    charBuf[0] = 0;
    charBuf[1] = 0;
    charBuf[2] = 0;
    charBuf[3] = 0;
    charBuf[4] = 0;
    charBuf[5] = 0;
    charBuf[6] = 0;
    charBuf[7] = 0;
    charBuf[8] = 0;
    charBuf[9] = 0;
    input_string.toCharArray(charBuf, 12);
      for (int i = 0; i < 10; i++){
      Serial.print("charBuf - ");
      Serial.print(i);
      Serial.print(" ");
      Serial.print(charBuf[i]);
      Serial.println("");}
     input_string = "";
    } else {
      input_string += c;}
  }
}

Получается теперь. что бы обратиться к определенному значению массива, я ссылаюсь на него. Но вот, что я бы хотел реализовать в итоге:

Отправляю:

Light:R.255 или Up:100

В моем примере длина слова команды до двоеточия разная и в коде, который я написал массив забивается 0 каждый раз при вводе новой команды. Подскажите, как реализовать запись данных в массив только после двоеточия? Моих знаний, к сожалению, пока не достаточно.

Надеюсь, что мой текущий код также кому-нибудь поможет в дальнейшем.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

проверяй символы  в строке на принадлежность к двоеточию.  Пока не оно - пропускай.  отдавай индекс следующего за двоеточием символа

itehno
Offline
Зарегистрирован: 18.04.2015

DetSimen пишет:

проверяй символы  в строке на принадлежность к двоеточию.  Пока не оно - пропускай.  отдавай индекс следующего за двоеточием символа

Согласен, так и нужно. Не понимаю как. )

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017
int8_t ScanForColon(const char *AString) {
	uint8_t index = 0;
	char ch;
	while ((ch = AString[index++])) {
		if (ch == ':') return index;
	}
     return -1;
}

отдасца или индекс следующего за ":" символа, или -1, если его нет.  Длина строки не более 127 байтов. 

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

itehno пишет:

"загнал2 строку в массив

А что там делает переменная типа String?

itehno пишет:

вот, что я бы хотел реализовать в итоге:

Отправляю:

Light:R.255 или Up:100

Здесь и в первом посте Вы пишете, что Вы хотите отправить. А в коде Вы ничего не отправляете. атолько принимаете. 

Вы уж определитесь и объясните внятно, что Вы делаете

itehno пишет:

В моем примере длина слова команды до двоеточия разная 

И что?

itehno пишет:

в коде, который я написал массив забивается 0 каждый раз при вводе новой команды. 

Зачем?

itehno пишет:

Подскажите, как реализовать запись данных в массив только после двоеточия? 

Ничего не понял, я уже просил Вас внятно формулировать задачу. Для начала определитесь, Вы "продаёте или покупаете".

itehno пишет:

Надеюсь, что мой текущий код также кому-нибудь поможет в дальнейшем.

Хорошая шутка.

Кстати, что там делает строка №15. Для чего она?

itehno
Offline
Зарегистрирован: 18.04.2015

DetSimen пишет:

int8_t ScanForColon(const char *AString) {
	uint8_t index = 0;
	char ch;
	while ((ch = AString[index++])) {
		if (ch == ':') return index;
	}
     return -1;
}

отдасца или индекс следующего за ":" символа, или -1, если его нет.  Длина строки не более 127 байтов. 

Спасибо, сейчас попробую разобраться с этой функцией.

 

itehno
Offline
Зарегистрирован: 18.04.2015

ЕвгенийП пишет:

А что там делает переменная типа String?

У меня пока мало знаний. Я думал, что так нужно.

ЕвгенийП пишет:

Здесь и в первом посте Вы пишете, что Вы хотите отправить. А в коде Вы ничего не отправляете. атолько принимаете. 

Вы уж определитесь и объясните внятно, что Вы делаете

Я ввожу строку посредством serialPort.

ЕвгенийП пишет:

Кстати, что там делает строка №15. Для чего она?

Забыл убрать.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Хочешь использовать String - почитай https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

особенно внимательно про её свойства и методы. И особенно про этот https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/

itehno
Offline
Зарегистрирован: 18.04.2015

DetSimen пишет:

Хочешь использовать String - почитай https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

особенно внимательно про её свойства и методы. И особенно про этот https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/

Вы имеете ввиду функцию substring(); ?

Понял, ответил раньше, чем заметил Ваше уточнение. Спасибо.

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

itehno пишет:

У меня пока мало знаний. Я думал, что так нужно.

Я ввожу строку посредством serialPort.

Забыл убрать.

Ну, тогда Ваш код точно

itehno пишет:
кому-нибудь поможет в дальнейшем.

itehno
Offline
Зарегистрирован: 18.04.2015

ЕвгенийП пишет:

Ну, тогда Ваш код точно

itehno пишет:
кому-нибудь поможет в дальнейшем.

Текущий код вполне работоспособен и новичкам вполне может пригодиться.

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

Вот и я ж про тоже.

itehno
Offline
Зарегистрирован: 18.04.2015

DetSimen пишет:

Хочешь использовать String - почитай https://www.arduino.cc/reference/en/language/variables/data-types/stringobject/

особенно внимательно про её свойства и методы. И особенно про этот https://www.arduino.cc/reference/en/language/variables/data-types/string/functions/indexof/

Я воспользовался Вашим советом, но мне не понятно, как выводить строку, после того, как я нашел с помощью indexOf нужный символ ":", который является маркером.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

1. Напиши внятно что надо сделать

2. Приведи пример своего кода, как ты пытался сделать пункт 1. 

 

Здесь помогают тому, кто пытается делать сам, а не разбрасываюца кодами.  

b707
Онлайн
Зарегистрирован: 26.05.2017

itehno пишет:

Текущий код вполне работоспособен и новичкам вполне может пригодиться.

не обманывай себя, "текущий код" - полная бредятина, просто свалка не связанных между собой команд.  И еще он может приводить к зависанию ардуины.

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

Кстати, забыл вчера сказать, функция сработает неверно, если ....

DetSimen пишет:

int8_t ScanForColon(const char *AString) {
	uint8_t index = 0;
	char ch;
	while ((ch = AString[index++])) {
		if (ch == ':') return index;
	}
     return -1;
}

отдасца или индекс следующего за ":" символа, или -1, если его нет.  Длина строки не более 127 байтов. 

но это тебе для тренировки мозга.  Пацказка, смотри в строку #5 а потом в #4

b707
Онлайн
Зарегистрирован: 26.05.2017

DetSimen пишет:

отдасца или индекс следующего за ":" символа, или -1, если его нет.  Длина строки не более 127 байтов.

а почему тип индекса не такой, как тип результата?

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

это будет след. упражнение для мозга.  А потом, что будет, если в первых 256 байтах ':' не найдётся. :) 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

проверки, оне, сцуки, непоправимо раздувають код 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

b707 пишет:

а почему тип индекса не такой, как тип результата?

На самом деле, канеш, это моя ошибка.  Естесственно, оне должны быть одного типа.  Но это так у меня всегда, дети красивые, а то что я делаю руками - никуда не годицца. 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

DetSimen пишет:

На самом деле, канеш, это моя ошибка.  Естесственно, оне должны быть одного типа.  Но это так у меня всегда, дети красивые, а то что я делаю руками - никуда не годицца. 

Я бы так не переживал:

int HardwareSerial::read(void)
{
  // if the head isn't ahead of the tail, we don't have any characters
  if (_rx_buffer_head == _rx_buffer_tail) {
    return -1;
  } else {
    unsigned char c = _rx_buffer[_rx_buffer_tail];
    _rx_buffer_tail = (rx_buffer_index_t)(_rx_buffer_tail + 1) % SERIAL_RX_BUFFER_SIZE;
    return c;
  }
}

 

DetSimen
DetSimen аватар
Offline
Зарегистрирован: 25.01.2017

ну, значить, не у одного меня дети красивые. :) 

sadman41
Онлайн
Зарегистрирован: 19.10.2016

DetSimen пишет:

ну, значить, не у одного меня дети красивые. :) 

Но int8_t на int16_t исправить стоит фюр орднунг.