Ограничить прием в Serial

ne4d
Offline
Зарегистрирован: 07.06.2022

Помогите ограничить сериал, без ограничения устройство виснет, т.к буфер переполняется, и сериал ждет паузу в 1сек на приеме, которой нет.

код 1й ардуины, она шлет на 2ю:

/* Описание логики:
1	3 раза Передается запредельное буферу число
2	Пошагово от [96-12]
3	Последним этапом передается огромное количество байт
*/
void setup() {
	Serial.begin(115200);
}

void loop() {
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 6912; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 3456; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 1728; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 864; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 432; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 216; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 108; i++){
			Serial.write(0xAA);
		}
	}
	delay(3000);	
	if (Serial.available()) {
		for(int i = 0; i < 138240; i++){
			Serial.write(0xAA);
		}
	}
}

код 2й ардуны, она принимает и виснет на последнем этапе:

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

void loop() {
	byte regular[7] = {0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA, 0xAA};
	Serial.write(regular, 7);
	while (Serial.available() > 0) {  //если есть доступные данные
		String mystr = Serial.readString();
		int mystr_length = mystr.length();
		int count = mystr_length / 9;
		Serial.print("count = ");
		Serial.print(count);
		Serial.println;
	}
	delay(500);
}

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

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

ne4d пишет:

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

чё?

ne4d пишет:

		for(int i = 0; i < 138240; 

Не многовато для int?

 

BOOM
BOOM аватар
Offline
Зарегистрирован: 14.11.2018

rkit пишет:

Не многовато для int?

В самый раз ))) Ну или пару раз... )))

И делеи в 3 сек. тоже туда же...

sadman41
Offline
Зарегистрирован: 19.10.2016

Не читайте в стринг, виснуть не будет.

ne4d
Offline
Зарегистрирован: 07.06.2022

исправил на 32767. Представьте что там бесконечный цикл

ne4d
Offline
Зарегистрирован: 07.06.2022

sadman41 пишет:
Не читайте в стринг, виснуть не будет.

как считать байты и посчитать их сумму?

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

Читайте побайтно.

Давно такой бредовой темы не было :)

ТС, зачем передавать один и тот же байт тысячи раз с паузами в 3 секунды? Это что, масонский ритуал?

ne4d
Offline
Зарегистрирован: 07.06.2022

подскажите кодом, в теме ардуино недавно, непонимаю, или наводку дайте

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

ne4d пишет:

подскажите кодом, в теме ардуино недавно, непонимаю, или наводку дайте


приняли один символ - увеличили счетчик на единицу.
И все.

Кстати, а первый то код хоть работает? Зачем вы проверяете Serial.available() , если вам надо не принимать, а отправлять?

sadman41
Offline
Зарегистрирован: 19.10.2016

https://www.arduino.cc/reference/en/language/functions/communication/ser...
Хотите - так читайте. Но побайтово читать/анализировать - рациональней решение.

ne4d
Offline
Зарегистрирован: 07.06.2022

да, 1й код работает, он отправляет по запросу, поэтому слушает

//приняли один символ - увеличили счетчик на единицу.
//И все.

немогу(

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

ne4d пишет:
//приняли один символ - увеличили счетчик на единицу.

//И все.

немогу(

Значить, не твоё, продавай свои ардуины, купи пива. 

mixail844
Offline
Зарегистрирован: 30.04.2012

выгляит как задание от препода , по которму надо принять "заранее неизвестное, но большое количество байт" . а второй скетч  - это решение ТС

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

ne4d пишет:

исправил на 32767. Представьте что там бесконечный цикл


Не многовато для int? Почему бы не написать бесконечный цикл, вместо того, чтобы представлять?

imp
Offline
Зарегистрирован: 20.06.2020

to ne4d На сколько можно понять, Вам надо принимать данные, но не сохранять их. Дык принимайте по байтно, и не сохраняйте. (Все равно все байты 0AAh.)

Второй момент, скорее всего, Вам еще нужно разделять сообщения, и судя по всему, по времени между ними.  Т.е. либо следить за временем в процессе ожидания следующего байта, и если оно превысило заданную величину (например в 2 секунды) то обнаружен конец сообщения. Или используйте прерывание от таймера, если за 2 секунды не пришло ни одного байта - сообщение принято.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

DetSimen пишет:

Значить, не твоё, продавай свои ардуины, купи пива. 

ТС на водку просил, а ты ему пиво )))

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

ne4d пишет:

наводку дайте

Вы пытаетесь принять в свой String 138240 символов.

Даже если бы Вы это делали правильно, Вы уверены, что столько поместится в память? Вы знаете сколько у Вас памяти?

Надеюсь, на водку хватит.

ne4d
Offline
Зарегистрирован: 07.06.2022

в том и дело, я не хочу принимать все. абстрагируемся, данные шлет не ардуино, мне нужно ограничить прием, тк я знаю что если сообщение превысило 100*9 байт, то оно неверно, а если 99*9 байт, то верно.

обожаю это комюнити, и дедовские шутки

ne4d
Offline
Зарегистрирован: 07.06.2022

переделал код отладчика, теперь он такой:

int num;

void setup() {
	Serial.begin(115200);
	Serial.setTimeout(200);
	num = 9;
}

void loop() {
		String reading = Serial.readString();
		int reading_length = reading.length();
		if (reading_length == 7){
		otpravka(num);

	}
}

void otpravka(int ii){
	for (int i = 0; i < ii; i++){
		byte test_byte = {0x07};
		Serial.write(test_byte);
		delay(5);
	}
	if (ii == 9){
		num = 90;
	}
	if (ii == 90){
		num = 450;
	}
	if (ii == 450){
		num = 720;
	}
	if (ii == 720){
		num = 32765;
	}
	if (ii == 32765){
		num = 9;
	}
}

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Кросивое...

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

ne4d пишет:

ii == 32765

Не многовато для int?

ne4d
Offline
Зарегистрирован: 07.06.2022

rkit пишет:

ne4d пишет:

ii == 32765

Не многовато для int?

не многовато, диапазон -32 768… 32 767.по теме есть что сказать?

 

ne4d
Offline
Зарегистрирован: 07.06.2022

принимаю побайтово, упираюсь в потолок буфера, 64байта...(

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

ne4d пишет:

принимаю побайтово, упираюсь в потолок буфера, 64байта...(


вранье, или показывайте код. Опять что-то делаете неверно.
при побайтовом приеме размер буфера вообще не имеет значения, можно хоть все ваши 138 тыс букв принять.

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

ne4d пишет:

в том и дело, я не хочу принимать все. 

Так и не принимайте. Вас кто-то связал и электрошокером пытает? Или зачем Вы "через нехочу" принимаете?

Обожаю когда задают вопросы не понимая что собственно спрашивают.

ne4d
Offline
Зарегистрирован: 07.06.2022

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

ne4d пишет:

в том и дело, я не хочу принимать все. 

Так и не принимайте. Вас кто-то связал и электрошокером пытает? Или зачем Вы "через нехочу" принимаете?

Обожаю когда задают вопросы не понимая что собственно спрашивают.

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

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

У нас тут за новичков код не пишут. Помогаем только тем, кто хочет научится сам.
Если тебе нужно готовое решение - пожалуйста в платный раздел.

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

ne4d пишет:
вменяемые люди здесь подсказывают
Да, ни хрена Вам не подсказывают. Никто (включая Вас) не может понять чего Вам собственно надо. Я лишь прямо об этом сказал, остальные постеснялись.

ne4d
Offline
Зарегистрирован: 07.06.2022

b707 пишет:
У нас тут за новичков код не пишут. Помогаем только тем, кто хочет научится сам. Если тебе нужно готовое решение - пожалуйста в платный раздел.

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

ne4d
Offline
Зарегистрирован: 07.06.2022

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

ne4d пишет:
вменяемые люди здесь подсказывают
Да, ни хрена Вам не подсказывают. Никто (включая Вас) не может понять чего Вам собственно надо. Я лишь прямо об этом сказал, остальные постеснялись.

там в первом посте все описано, опустить момент просто нужно зачем это ТС. и дать намек куда ему копать, возможно мы люди просто разные, очень

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

ne4d пишет:

я понимаю, но все же дискуссия помогла мне решить проблему. просто можно же нормально писать, без язвы, это не квам, к человеку с аватаркой свиньи/p>


я разочарован. Я так старался, а отметили вы только Евгения..
Неужели я меньше вас троллил?

На самом деле, никто не любит таких, кто вместо того чтоб учится думать самому - приходит на форум и начинает требовать готовое решение.

Не хотите показать, как вы решили проблему? Или на самом деле никакого решения нет?

ne4d
Offline
Зарегистрирован: 07.06.2022

b707 пишет:
ne4d пишет:

я понимаю, но все же дискуссия помогла мне решить проблему. просто можно же нормально писать, без язвы, это не квам, к человеку с аватаркой свиньи/p>

я разочарован. Я так старался, а отметили вы только Евгения.. Неужели я меньше вас троллил? На самом деле, никто не любит таких, кто вместо того чтоб учится думать самому - приходит на форум и начинает требовать готовое решение. Не хотите показать, как вы решили проблему? Или на самом деле никакого решения нет?

значит вы были тактичнее или я просто не понял что вы тролите.

в итоге получилось упаковать в миллис, можно скоректировать значение миллис и получить нужное предельное значение, если мусор все еще идет по сериалу, значение постоянно меняется но очевидно что оно неверное

uint32_t time = millis();
while (millis() - time < 2500){
	while (Serial.available() > 0){
		Serial.read();
		bytes_count++;
		}
	}
Serial.print(bytes_count/9);

 

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

ne4d пишет:
возможно мы люди просто разные, очень

Так и есть.

ne4d пишет:
я просто не понял что вы тролите

Скажу Вам по секрету - все остальные - тоже. Просто, Вы какой-то непонятливый :-)

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

Ne4d ну что, неплохо.
удивительно что вы все-таки написали код. Не ожидал.
Приходите еще.

ne4d
Offline
Зарегистрирован: 07.06.2022

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

ne4d пишет:
возможно мы люди просто разные, очень

Так и есть.

ne4d пишет:
я просто не понял что вы тролите

Скажу Вам по секрету - все остальные - тоже. Просто, Вы какой-то непонятливый :-)

наверное для вас принципиально написать, чтобы последнее сообщение было за вами, я перестану вам отвечать, можете накидывать

ne4d
Offline
Зарегистрирован: 07.06.2022

b707 пишет:
Ne4d ну что, неплохо. удивительно что вы все-таки написали код. Не ожидал. Приходите еще.

спасибо, еще загляну

Green
Offline
Зарегистрирован: 01.10.2015

Пока свои мысли не научитесь формулировать, то лучше не надо.

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

подскажу секрет: Serial.available() возвращает цифру.