требуется решить задачу не знаю как.
в порт записывается строка: Led_2_6666 (_ ) - пробел)
как прочитать строку по символьно и записать значения в массивы
если led_2 то mLed2[]={6,6,6,6}
если led_3 то mLed3[]={6,6,6,6}
что то недоконца работает
String BUFFER[8];
String inString = "";
char inChar;
void setup()
{
Serial.begin(115200);
}
void loop()
{
if(Serial.available()) // Слушаем порт
{
inChar = Serial.read(); // Читаем символ
inString = inString+inChar; // Переводим Char в String, набираем нужное кол-во символов
if(inString.length() == 1) // Поймали1 символа
{
BUFFER[0] = inString;
inString = ""; // Обнуляем строку
Serial.println(BUFFER[0]);
}}}
Так до начала тоже нихрена не работает.
Пришла буковка "L" (самая первая). Вы радостно кричите "поймали 1 символ". Запихиваете его в BUFFER[0]и обнуляете строку. Потом пришла буковка "e". Вы снова радостно кричите "поймали 1 символ". Запихиваете его в BUFFER[0]и обнуляете строку.
Каков смысл этого действия? Для чего Вы его написали?
учусь программитровать, поэтому практикуюсь на задачках из форума. Вот скетч
по сути тебе надо только
Может так:
Serial
.readString();
вроде как долго ждёт. может так стандартно:Serial
.readString();
вроде как долго ждёт.Serial
.readString()
ничего не ждет. он читает то что есть в сериале в данный момент. Это надо учитывать в коде, а то многие ошибочно полагают, чтоSerial
.readString()
ждет символы перевода строкиSerial
.readString()
ничего не ждет. он читает то что есть в сериале в данный момент.Ну, таймаут-то вроде ей можно назначить, так что может и подождать немножко. Однако, она действительно не ждёт перевода строки и никакого другого симвлоа. Просто вычитывает то что есть.
Если надо ждать перевода строки или любого другого терминального символа, то лучше использовать readStringUntil(). Эта будет ждать терминального символа и вылетит когда либо дождётся, либо таймаут истечет.
Покажите пример аналогичный моему с readString, если не сложно. А то не пойму как его использовать. Только надо без задержек.
Ну, я пока не понимаю чего Вы просите. Вам говорят как раз о возможности дождаться терминального символа, а Вы "без задержек". А если не пришёл ещё конец строки, тогда чего делать?
Может так:
вот человек предложил вместо Serial.Read применить Serial.readString. я это имел ввиду. Чем тут лучше будет Serial.readString? В примере, предложенным мной, символ будет "ожидаться", не тормозя программу. А как будет вести себя Serial.readString, дожидаясь необходимый символ?
Serial
.readString()
ничего не ждет. он читает то что есть в сериале в данный момент.вот что я нашел в описании. "Функция readString() считывает символы из потока, объединяя их в строку. Функция прекращает свою работу в случае таймаута (см. setTimeout())."
открываем про setTimeout()) там говорится "Функция setTimeout() устанавливает максимальное время ожидания потока данных (значение по умолчанию - 1000 миллисекунд). "
Т.е. будет ждать 1 сек даже если данных нет?
Блин, ну поставьте Вы как я Вам писал readStringUntil - Там же всё просто. Пришёл терминальный символ - всё ничего больше не ждём. не пришёл - ждём пока придёт. Вам всё равно конца строки ждать, так акая Вам нафиг разница?
да мне не куда ставить, я просто тут мимо проходил, но хочу понять суть. Может Вы меня не правильно поняли, или я сам себя не понял. Я Вам толкую, что хочется научиться делать такие конструкции, чтоб программа не задерживалась (в данном случае чтение из буфера), ведь ещё может быть что-то другое в программе, которое не терпит задержки. пример из сообщения #5 будет нормально работать? если да, то хотелось бы увидеть что-то подобное но с readStringUntil или
Serial
.readString.
Я всё это пишу с целью образования, чтобы программировать, а не кодить. Не пойму зачем использовать функции с таймаутами, когда чащеприменяемый Serial.read и так нормально сработает.MaksVV, попытайтесь внятно сформулировать: по какому критерию программа, читающая строку, может понять, что строка прочитана полностью?
Serial.read работает нормально (если им уметь пользоваться), но читает один байт, а не строку, поэтому поставленный вопрос остается открытым.
пробел например или перевод строки или перевод каретки. Ну пусть Serial.read читает один байт, за несколько проходов будем ростить строку, пока не увидим критерий конца строки.
Мне было непонятно почему ТСу , который пытался с помощью Serial.read записать строку, предложили другие функции с таймаутами. чем они лучше?
Блин, неужели я так не умею мысли выражать. Чтоб, наконец, все поняли о чем я. вот вам два скетча загрузите, смотрите как мигает светодиод, когда отправляем на ардуино из монитора любые символы да побольше (кроме перевода каретки, кто не знает в мониторе ставим "нет конца строки")
первый
второй
Что их загружать? И так понятно как они работают. Парсить строку надо только поглубже, а то символы разные бывают.
А с советами - если надо что то делать только по приходу строки проще стандартный парсер взять. С таймаутом и блокировкой. Если ещё что то делать во время ожидания строки - свой писать. Выбираешь сам, по задаче.
Формат принимаемой строки всегда такого типа: "Led_2_6666 (_)"?
Всем спасибоб задачу почти решил.
проблема осталась в том, что получаем строку из порта string A =123456
и как эту строку записать в int led[]={1,2,3,4,5,6}
'0'
; что это ?
http://www.industrialnets.ru/files/misc/ascii.pdf
Найдите в таблице, графа Char: 0 и 6, Теперь из значений в графе Dec вычтите первое из второго. Что получится?
спасибо
Serial
.readString()
ничего не ждет. он читает то что есть в сериале в данный момент.Ну, таймаут-то вроде ей можно назначить, так что может и подождать немножко. Однако, она действительно не ждёт перевода строки и никакого другого симвлоа. Просто вычитывает то что есть.
Если надо ждать перевода строки или любого другого терминального символа, то лучше использовать readStringUntil(). Эта будет ждать терминального символа и вылетит когда либо дождётся, либо таймаут истечет.
А если надо принять строку символов и сохранить в char mystring[50] есть ограничение на длину строки для сериального порта, я о буфере в 16 байт или строка примется полностью, если укладывается в эти 50 байт?