Как, как? По счётчику. Заносишь в счётчик число равное количеству байтов, которое надо пропустить. На каждой итерации принятого байта (в прерывании, например), инкрементируешь счётчик. Как только досчитал до нуля - все следующие байты твои. И так до конца строки. Принял символ конца строки - сбрасываешь флаг начала пакета (или что там у тебя) и снова ждёшь новый пакет. Как только принял первые байты нового пакета, опять взводишь счётчик и алгоритм повторяется.
@parovoZZ не путай с прерываниями человека, пусть из loop() в цикле через Serial.read() вытаскивает, разницы то в его случае нет. А Serial и так через прерывания работает.
ну ведь уже раз пять подсказали - пропусти все ненужные байты в начале и потом читай свой. Что непорнятно? А насчет примера кода - неужели сами не осилите написать какой-нить цикл while с Serial.read() внутри? Стыдно должно быть такие примеры просить
Может так - попытка char incoming[127];//массив символов по уарту - не помню сколько там ограничение if (Serial.available() > 0) {for (i = 0; i < 128; i++) {incoming = Serial.read();//принимаем в первый байт массива первый приходящий байт} if (incoming == '9') - то считываем что там лежит
Здравствуйте! К сожалению не получилось оформить ваши мысли в работающий код. Можно попросить пример?
Инкремент - прибавление единицы. Отнимание единицы - декремент. Досчитать до нуля с положительными числами можно только декрементом.
А что получилось? Хоть какой нибудь покажите. Вот, что у меня получилось: Код (C++): const int SkipNumber = 10; // Заносишь в счётчик число равное количеству байтов, которое надо пропустить. int BytesCount; const int ReqBytes = 5; // Количество нужных байт из пакета bool ReqFlag; // Принимаем или пропускаем данные void setup() { Serial.begin(115200); Serial.println("Start..."); Serial.println("Skiped:"); } void loop() { while (Serial.available()) { char inChar = (char)Serial.read(); BytesCount++; // На каждой итерации принятого байта инкрементируешь счётчик. Serial.print(inChar); if (ReqFlag) // Если нужные данные то попадают сюда { if (BytesCount == ReqBytes) { BytesCount = 0; ReqFlag = false; // сбрасываешь флаг начала пакета Serial.println(""); Serial.println("Skiped:"); } } else // Ненужные пропускаем { if (BytesCount == SkipNumber) { BytesCount = 0; ReqFlag = true; // взводишь флаг нужного пакета Serial.println(""); Serial.println("Needed:"); } } } } Каждые 10 байт мы пропускаем, потом 5 принимаем.
Код (C++): static unsigned char i = 0; static char buff[60]; void setup() { Serial.begin(9600); } void loop() { while (Serial.available() ) { char inChar = (char)Serial.read(); if (inChar == char(62))// если есть символ окончания">", обнуляем счетчик и выводим { Serial.print(buff); buff[i] = 0; i = 0; } else i++; if (i == 60) i = 0; buff[i] = inChar; } } я делал несколько вариантов. но самый простой получился на примере из первых рекомендаций. Если учесть, что нужные байты находятся на 40-й позиции от конца . Создал маленький буфер и циклично его переписывал, пока не появится символ окончания ">". так в массиве размером buff[60] остается нужный байт из конца пакета. Правда, команда Serial.print(buff); в итоге выводит совершенно искаженный массив, совсем не в той последовательности, в которой он поступил
Наконец-то разродились. Вопрос - если пакеты фиксированной длины, значит и положение от начала фиксированное. Зачем тогда накапливать буфер ? Считывайте и игнорьте первые ненужные байты пока не дойдете до нужного адреса, считывайте нужное количество, остальное считывайте, но опять игнорьте. Это требуется для опустошения приемного буфера UART. Код (C++): int i=0; int y=0; int AddrStart = XX;; int buffLeng = YY; byte b; byte buff[buffLeng]; void setup() { Serial.begin(9600); } void loop() { while (Serial.available() ) { b=Serial.Read(); if( i > AddrStart && i < (AddrStart + buffLeng)) { buff[y] = b; y++; } i++; } i=0; y=0; .......... } как-то так.
если ваш кода адаптировать, то не работает Код (C++): int i = 0; int y = 0; #define AddrStart 5 #define buffLeng 3 //byte b; char buff[buffLeng]; void setup() { Serial.begin(9600); } void loop() { while (Serial.available() ) { char b = (char)Serial.read(); if ( i > AddrStart && i < (AddrStart + buffLeng)) { buff[y] = b; y++; Serial.print(buff); } i++; Serial.print(buff); } i = 0; y = 0; Serial.print(buff); }
не надо Serial вставлять где попало Нужно дождаться полного чтения нужных байт, добавить нулевой терминатор в буфер и только потом выводить его на печать
просто не умеете. Надо учиться. Вместо того чтоб просить "дайте примерчик", пробуйте писать сами. За тот месяц. что вы мучаете этот несчастный Сериал - могли бы гуру программирования стать
я пробую в свободное от школы время. К сожалению, не получается. Даже у гуру программирования не получается.