PDA

Просмотр полной версии : Теряю байты! SisLibCom



Georgiy
28.03.2011, 07:36
Столкнулся с проблемой при передачи данных в порт RS232 из файла. Передаю массив из 297 строк, каждая строка по 44 байта. При трассировке ловлю на ПК свои посылки корректно, но в нормальном режиме сообщения прилетают неполные, кусками. Вот кусок моего кода, может, кто подскажет как сделать нормальную передачу?
Я пробовал разнести загрузку в массив данных из файла и выгрузку их в порт, но все одно, загружается в массив из файла корректно, а в порт выдается с провалами. :confused: ПЛМ100, время цикла менял от 10 до 50мс, разницы никакой.
var
Log_masout: ARRAY [1..297] OF STRING(44);
end_var

FOR ist:=1 TO 297 DO
SysFileRead(Flogget,ADR(Log_masout[ist]),44);
SysComWrite(com_num,ADR (Log_masout[ist]),LEN (Log_masout[ist]),50);
END_FOR;

Александр Приходько
28.03.2011, 10:16
С данной библиотекой работал не раз. Таких проблем не наблюдал, даже в очень больших запросах. Скорее всего вопрос к реализации вашего алгоритма.

P.S.
функция SysComWrite возвращает число отправленных байт. Делайте проверку числа отправленных байт. Возможно вы не успеваете это делать за один цикл, а начинаете дальнейшую обработку.

Александр Приходько
28.03.2011, 10:17
И ни кто не отменял UNM. Попробуйте пользоваться, ей.

Georgiy
28.03.2011, 10:31
реализацию алгоритма я указал в вопросе - читаю из файла в массив Log_masout, и вывожу в порт то, что прочитал.
А как сделать проверку на количество отправленных байт? Я понимаю, что
SysComWrite возвращает количество отправленных байт, (у меня должно быть 44 байта), допустим будет не 44, а меньше, что в данном случае надо сделать?
test:=SysComWrite(com_num,ADR (Log_masout[ist]),LEN (Log_masout[ist]),0);
т.е. test<>44, как эту информацию обработать, кинуть еще раз в порт? Буду очень благодарен за помощь.

Georgiy
28.03.2011, 10:33
Честно говоря, никогда с той библиотекой не работал. Попробую конечно, а то я встрял с этой проблемой, уже второй день не могу продвинуться дальше.

Александр Приходько
28.03.2011, 10:57
Ждать пока не отправит. Если не отправит за нужный период, кинуть еще раз. Как вариант.
Вообще звчем велосипед изобретать. Пример есть, берите за основу, изучайте.
http://www.owen.ru/forum/showpost.php?p=41631&postcount=58

Дмитрий Артюховский
28.03.2011, 11:22
Скорее всего вы буфер отправки переполняете. Также не очевидно использование вызова отправки в порт. И походу, вы, не очень понимаете как работает контроллер сканирующего типа.

Для стабильности алгоритма нужно полностью сформировать массив для отправки, после чего передать его в порт целиком. У вас же реализована набивание буфера отправки кусками.

Мне почему то кажется что реальная физическая отправка начнется в "служебное" время контроллера, т.е после окончания пользовательского куска программы и поэтому использование многократного вызова функции записи в порт нецелесообразно.

Я бы отправлял в порт данные по строке за цикл с проверкой окончания предыдущей передачи (хотя бы по времени, т.е. выдерживая паузу требуемую для отправки текущего количества символов + 1 цикл)

Georgiy
28.03.2011, 11:26
Спасибо, Александр, буду разбираться.