Показано с 1 по 8 из 8

Тема: Теряю байты! SisLibCom

  1. #1

    Post Теряю байты! SisLibCom

    Столкнулся с проблемой при передачи данных в порт RS232 из файла. Передаю массив из 297 строк, каждая строка по 44 байта. При трассировке ловлю на ПК свои посылки корректно, но в нормальном режиме сообщения прилетают неполные, кусками. Вот кусок моего кода, может, кто подскажет как сделать нормальную передачу?
    Я пробовал разнести загрузку в массив данных из файла и выгрузку их в порт, но все одно, загружается в массив из файла корректно, а в порт выдается с провалами. ПЛМ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;

  2. #2

    По умолчанию

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

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

  3. #3

    По умолчанию

    И ни кто не отменял UNM. Попробуйте пользоваться, ей.

  4. #4

    По умолчанию

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

  5. #5

    По умолчанию

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

  6. #6

    По умолчанию

    Ждать пока не отправит. Если не отправит за нужный период, кинуть еще раз. Как вариант.
    Вообще звчем велосипед изобретать. Пример есть, берите за основу, изучайте.
    http://www.owen.ru/forum/showpost.ph...1&postcount=58

  7. #7

    По умолчанию

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

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

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

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

  8. #8

    По умолчанию

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

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •