Отсечь от строки несколько первых символов
- Войдите на сайт для отправки комментариев
Пт, 14/06/2019 - 21:22
Добрый день.
Я хочу отправить в Serial.port команду вида: RGB:R
Мне нужно, что бы отсеклась RGB: и в некую переменную записалось R
Покажите, пожалуйста, простейшим примером, как это делать. Всю голову уже сломал.
Почитайте про массивы в С/С++
Мне нужно, что бы отсеклась RGB: и в некую переменную записалось R ... Всю голову уже сломал.
Вы завязывайте голову ломать. Есть только две вещи, от которых у нормального мужика может сломаться голова и тривиальной задачки про массив среди этих вещей не значится.
Выпишите свою строку на клетчатой бумаге (по одному символу в клетке) и делайте, что Вам посоветовал коллега постом выше. Озарение придёт через минуту - другую.
Добрый день. Я последовал Вашим советам и "загнал" строку в массив. Вот пример моего кода:
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 каждый раз при вводе новой команды. Подскажите, как реализовать запись данных в массив только после двоеточия? Моих знаний, к сожалению, пока не достаточно.
Надеюсь, что мой текущий код также кому-нибудь поможет в дальнейшем.
проверяй символы в строке на принадлежность к двоеточию. Пока не оно - пропускай. отдавай индекс следующего за двоеточием символа
проверяй символы в строке на принадлежность к двоеточию. Пока не оно - пропускай. отдавай индекс следующего за двоеточием символа
Согласен, так и нужно. Не понимаю как. )
int8_t ScanForColon(const char *AString) { uint8_t index = 0; char ch; while ((ch = AString[index++])) { if (ch == ':') return index; } return -1; }отдасца или индекс следующего за ":" символа, или -1, если его нет. Длина строки не более 127 байтов.
"загнал2 строку в массив
А что там делает переменная типа String?
вот, что я бы хотел реализовать в итоге:
Отправляю:
Light:R.255 или Up:100
Здесь и в первом посте Вы пишете, что Вы хотите отправить. А в коде Вы ничего не отправляете. атолько принимаете.
Вы уж определитесь и объясните внятно, что Вы делаете
В моем примере длина слова команды до двоеточия разная
И что?
в коде, который я написал массив забивается 0 каждый раз при вводе новой команды.
Зачем?
Подскажите, как реализовать запись данных в массив только после двоеточия?
Ничего не понял, я уже просил Вас внятно формулировать задачу. Для начала определитесь, Вы "продаёте или покупаете".
Надеюсь, что мой текущий код также кому-нибудь поможет в дальнейшем.
Хорошая шутка.
Кстати, что там делает строка №15. Для чего она?
int8_t ScanForColon(const char *AString) { uint8_t index = 0; char ch; while ((ch = AString[index++])) { if (ch == ':') return index; } return -1; }отдасца или индекс следующего за ":" символа, или -1, если его нет. Длина строки не более 127 байтов.
Спасибо, сейчас попробую разобраться с этой функцией.
А что там делает переменная типа String?
У меня пока мало знаний. Я думал, что так нужно.
Здесь и в первом посте Вы пишете, что Вы хотите отправить. А в коде Вы ничего не отправляете. атолько принимаете.
Вы уж определитесь и объясните внятно, что Вы делаете
Я ввожу строку посредством serialPort.
Кстати, что там делает строка №15. Для чего она?
Забыл убрать.
Хочешь использовать 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/
Хочешь использовать 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(); ?
Понял, ответил раньше, чем заметил Ваше уточнение. Спасибо.
У меня пока мало знаний. Я думал, что так нужно.
Я ввожу строку посредством serialPort.
Забыл убрать.
Ну, тогда Ваш код точно
Ну, тогда Ваш код точно
Текущий код вполне работоспособен и новичкам вполне может пригодиться.
Вот и я ж про тоже.
Хочешь использовать 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 нужный символ ":", который является маркером.
1. Напиши внятно что надо сделать
2. Приведи пример своего кода, как ты пытался сделать пункт 1.
Здесь помогают тому, кто пытается делать сам, а не разбрасываюца кодами.
Текущий код вполне работоспособен и новичкам вполне может пригодиться.
не обманывай себя, "текущий код" - полная бредятина, просто свалка не связанных между собой команд. И еще он может приводить к зависанию ардуины.
Кстати, забыл вчера сказать, функция сработает неверно, если ....
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
отдасца или индекс следующего за ":" символа, или -1, если его нет. Длина строки не более 127 байтов.
а почему тип индекса не такой, как тип результата?
это будет след. упражнение для мозга. А потом, что будет, если в первых 256 байтах ':' не найдётся. :)
проверки, оне, сцуки, непоправимо раздувають код
а почему тип индекса не такой, как тип результата?
На самом деле, канеш, это моя ошибка. Естесственно, оне должны быть одного типа. Но это так у меня всегда, дети красивые, а то что я делаю руками - никуда не годицца.
На самом деле, канеш, это моя ошибка. Естесственно, оне должны быть одного типа. Но это так у меня всегда, дети красивые, а то что я делаю руками - никуда не годицца.
Я бы так не переживал:
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; } }ну, значить, не у одного меня дети красивые. :)
ну, значить, не у одного меня дети красивые. :)
Но int8_t на int16_t исправить стоит фюр орднунг.