Приветствую, столкнулся со следующей проблемой на ПЛК 110-30. порт RS232(COM1)
При чтении из буфера КОМ порта теряются байты, причем не начало или конец а середина.
Для отладки, в ком писал буфер 255байт со значениями от 1 до 255, заметил что пропадают
значения ....1,2,3,5,7,8,9,10,15,16,17, т.е куда то делись 4, 6 ,11 и, тд. закономерности особой нет,
могут теряться и другие.
Если оставить в проекте только процедуру чтения из порта то все вродебы в порядке, если сменить скорость на 9600, тоже становится легче.
Но в проекте крутится 5 сокетов, 1 ПИД и деть их никуда нельзя. И вот когда это все в куче работает получаю потерю байт.
Время цикла(MinCycleLength) менял в пределах от 1 до 50, остановился на 0, не помогло.
параметр dwBytesToRead, функции SysComRead, менял, было 1,2,3,4,8,16,32,64,128,255.
ReadTimeout(IN:=(ByteResive=0),PT:=T#10ms); Таймаут приема менял до 1000мс, Т.к данные шлю я то я их отправлял с интервалом 1 раз в 3 сек.
на скорости 9600 теряется 5% посылок
на скорости 19200 уже 50%
на скорости 115200 потеря 95% битых посылок
Кусок кода чтения из порта:
IF SerialOpen THEN
ByteResive := SysComRead(Port,ReciveBuffer+totalBytesResive,255, 0);
ReadTimeout(IN:=(ByteResive=0),PT:=T#10ms);
IF ByteResive > 0 THEN
totalBytesResive := totalBytesResive + ByteResive;
END_IF
IF ReadTimeout.Q THEN
ReadTimeout(IN:=FALSE);
IF totalBytesResive > 0 THEN
uiBytesResive := DWORD_TO_UINT(totalBytesResive);
END_IF
totalBytesResive := 0;
DataReceptionFinish := INIT;
serSTATE := serREAD;
INIT:=TRUE;
END_IF
ELSE
serSTATE := serOPEN;
END_IF
кто что посоветует?
Какой физический буфер ком порта?
Как отследить его переполнение?
Что будет если я буду забирать данные из ком порта 1 раз в 2 цикла(куда они денутся если я их не заберу)?
if (i MOD 2) = 0 then
ByteResive := SysComRead(Port,ReciveBuffer+totalBytesResive,255, 0);
end_if
i:=i+1;
Поиде данные должны остаться в буфере, и считаны при следующем обращении, или нет?