Есть вероятность чтения нескольких пакетов за раз и они могут быть не полными. А так ты по указателю записи пишешь в колцевой буфер функцией Read.
Есть вероятность чтения нескольких пакетов за раз и они могут быть не полными. А так ты по указателю записи пишешь в колцевой буфер функцией Read.
bytes_read := SysComRead(com_settings.Port,ADR(buffer[1]),50,0);
FOR i:=1 TO bytes_read DO
bufferR[pWr] := buffer[i]; (*нужно еще сделать проверку на затирание данных(Полный буфер)*)
pWr := pWr + 1;
if pWr > XXX THEN p Wr := 0;
end_IF;
END_FOR
IF pWr <> pRd THEN (*В буфере есть данные *))
...
Но и нужно правильно подобрать время цикла и размер буфера чтения и кольцевого!
Последний раз редактировалось Samel; 20.06.2022 в 13:38.
Samel а второй и третий порванный
Суть простая, что предлагает keysansa чтение 2-ного количества байт, внутри которого на 100% будет полный ответ. Начали сессию, нашли цельный буфер, распихали данные, новая сессия....
Спасибо. Но это вариант для ТС (возможны пропуски пакета, что бы не отставать по времени, я предлагал сбрасывать буфер порта), если возникает ситуация, что нельзя пропустить ни один пакет - тут только работа по прерыванию. По получению очередного байта, проверяем его на соответствие пакету и далее, принимаем решение. В ранних контроллерах был доступен режим DMA к буферу COM порта, там не надо было свой буфер, дополнительный, создавать. 1500 байт хватало для всех случаев. Но потом стали передавать данные в виде строки... И понеслось ))
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
Кольцевой буфер тоже должен помещать пакет полностью. Иначе он не будет работать.
ЗЫ. В случае с переменной длинной пакета - его все равно придется считать. Проще 10*х заложить, сегодня память дешевая.
ЗЫЫ. Мусор на шине не влияет на длинну буфера, нет пакета в буфере - очищаем, пишем ошибку и работаем заново.
Последний раз редактировалось keysansa; 20.06.2022 в 14:09.
В трансформаторной будке живет трансформаторная собака (с) Прозрачный гонщик
В задаче не хватает нескольких переменных:
1. Частота пакетов.
2. Требуемая актуальность данных.