Добрый день всем!
Имею устройство, которое 24/7 без смс и регистрации отправляет по 485 портику на скорости света 115200 посылку вида:

байт FF
байт 03 (типа его адрес)
байт CC (типа функция)
16 байт данных
байт контрольной суммы CRC
байт FF
байт FF

итого 22 байта.

я уже все это получаю и разбираю следующим кодом:

Код:
PROGRAM com_read_prg
VAR
	com_settings: COMSETTINGS;
	com_service_fb: COM_SERVICE;
	com_port_num: PORTS := 0;
	com_port_ready: BOOL;

	bytes_read: DWORD;
	buffer: ARRAY [1..50] OF BYTE;
	package: ARRAY [1..22] OF BYTE;
	p_pointer: POINTER TO ARRAY [1..22] OF BYTE;
	i,ii: INT;
	weight: weight_package;
	p1: POINTER TO BYTE;
END_VAR


IF com_service_fb.ready=FALSE THEN
	com_settings.Port:=com_port_num;
	com_settings.dwBaudRate:=115200;
	com_settings.byParity:=0;
	com_settings.dwTimeout:=0;
	com_settings.byStopBits:=0;
	com_settings.dwBufferSize:=0;
	com_settings.dwScan:=0;
	com_service_fb(Enable:=TRUE, Settings:=com_settings, Task:=OPEN_TSK);
	com_port_ready:=FALSE;
ELSE
	com_service_fb.Enable:=FALSE;
	com_port_ready:=TRUE;
END_IF

IF com_port_ready THEN
	bytes_read := SysComRead(com_settings.Port,ADR(buffer[1]),50,0);   (*каждый цикл читаем 50 байт данных потому что в них я точно найду нужные мне 22 байта*)
	IF bytes_read > 0 THEN (*если что-то нашли*)
		FOR i:=1 TO 28 DO (*то начинаем искать совпадение*)
			IF (buffer[i] = 16#FF) AND (buffer[i+1] = 16#03) AND (buffer[i+2] = 16#CC) AND      (*не парюсь ищу совпадение по началу и концу которые всегда одинаковые*)
			    (buffer[i+20] = 16#FF) AND (buffer[i+21] = 16#FF) THEN
				p_pointer := ADR (buffer[i]);     (* если нашли то при помощи указателя*)
				package := p_pointer^;             (*копируем найденное в массив ровно на 22 байта, это я потом чтобы контрольную сумму считать*)

				p1 := ADR(weight.ch1);   (* weight - это структура тупо из 8 UINT, поэтому я свой массив перевожу в уинт чтобы далее его использовать*)
				FOR ii:=4 TO 19 DO  
					p1^ := package[ii];
					p1 := p1+1;
				END_FOR

				EXIT;
			END_IF

		END_FOR
	END_IF
END_IF
И у меня возникло несколько вопросов:
1. Так как скорость 115200, я думаю считывая по 50 байт каждый цикл (50 мсек), мне кажется рано или поздно случится переполнение буфера?

Я не очень понимаю как этот буфер устроен.
2. Не понимаю - я читаю данные из конца или из начала этого буфера?
3. Вроде как прочитанные данные из буфера стираются, это так или не очень?

Анализируя данные в буфере я обратил внимание что посылки бывают кусками, хотя по факту я на 100000000000000% уверен что они всегда ровненькие и одинаковые
4. Почему в буфере могут быть обрывки? это потому что я своими 50 байтами там оставляют объедки от них?


Ну и самый главный вопрос - если у кого-то есть бесплатные идеи по оптимизации - готов бесплатно их выслушать =)
Или в целом концепция как лучше поступить в моей ситуации - просто слушать эти 22 байта