Конференция "WinAPI" » Как определить что данные черех СОМ порт отправлены??? [D7, WinXP]
 
  • Андрей Пл (13.02.08 17:23) [0]
    Я работаю с компортом посредством WinAPI функций.
    Ситауция следущая устройство с которым я должен общаться посредством ком порта имеет следующее условие:

    перед посылкой данных я должен сбросить сигнал RTS  отослать данные и после этого востановитбь RTS .

    EscapeCommFunction(Hport, CLRRTS );
     WriteComm(buf,n,m);
    EscapeCommFunction(Hport, SETRTS);


    но проблема в том что реально данные записываются в буфер компорта и на момент  когда я установил RTS данный в устройство еще не отправлялись или не все доходили.

    Как мне программно установить факт отправки всех данных компортом или наверное что тоже самое что буфер СОМ порта пуст???
    заранее спасибо.
  • MBo © (13.02.08 17:35) [1]
    SetCommMask с EV_TXEMPTY, или FlushFileBuffers ?
  • Германн © (14.02.08 01:58) [2]

    > MBo ©   (13.02.08 17:35) [1]

    Имею неподтвержденные сведения, что сей вариант (SetCommMask с EV_TXEMPTY) нормально работает только при размере буфера FIFO СОМ-порта равным 1.

    P.S. Речь конечно идёт о протоколе RS-485.
  • МистерТ (18.02.08 15:33) [3]
    Для обычного RS-232 (если работа с ним ведется через WriteFile()) возможно проверить количество отправленных байт функцией:
    BOOL WINAPI GetOverlappedResult(
     __in          HANDLE hFile,
     __in          LPOVERLAPPED lpOverlapped,
     __out         LPDWORD lpNumberOfBytesTransferred,
     __in          BOOL bWait
    );


    Может поможет...
  • orinoko (19.02.08 12:00) [4]
    Если речь идёт о RS-485, то, как я понимаю, манипуляции с RTS нужны для переключения преобразователя 232-485 на приём-передачу. Смею дать совет. Не заморачиваться с этим. У нас это реализовано аппаратно в преобразователе. По началу передачи переводить аппаратно 485 интерфейс на вывод. По отсутствию импульсов на Tx в течение примерно 3Т (Т - время отсылки 1 байта) таймером (мы использовали NE555 таймер) он автоматом переводится на приём
  • Андрей Пл (27.02.08 10:18) [5]
    >orinoko   (19.02.08 12:00) [4]
    да ты прав на счет

    > манипуляции с RTS нужны для переключения преобразователя
    > 232-485 на приём-передачу

    но то что ты говоришь у вас аппаратно реализовано в преобразователе у нас судя по моему ТЗ не реализовано :(
  • Андрей Пл (27.02.08 11:05) [6]
    Что то ничего не выходит!!! Прошу помощи!!!

    функция SetCommMask с EV_TXEMPTY тоже что то не так работает вроде бы событие то что буфер пустой происходит, а на осциллографе  (который прикреплён к преобразователя 232-485) вижу что не все данные еще отправлены.
  • Evgeny V © (27.02.08 13:12) [7]
    I>
    > Андрей Пл   (13.02.08 17:23)  
    > Андрей Пл   (27.02.08 11:05) [6]

    Как вариант -функция SetCommState ->
    DCB->
    -> fRtsControl
    ->RTS_CONTROL_TOGGLE

    Правда с уровнем судя по всему все наоборот, но думаю инвертор вполне можно поставить...
 
Конференция "WinAPI" » Как определить что данные черех СОМ порт отправлены??? [D7, WinXP]
Есть новые Нет новых   [134431   +14][b:0][p:0.001]