comm port: rx framing

Тема в разделе "WASM.ELECTRONICS", создана пользователем Dukales, 31 авг 2010.

  1. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    Существует следующая проблема: необходимо выделять фреймы при приёме через COM-порт с такими настройками:
    Код (Text):
    1.  dcb.fBinary  = TRUE;
    2.  dcb.fParity  = FALSE;
    3.  dcb.BaudRate = CBR_115200;
    4.  dcb.ByteSize = CHAR_BIT;
    5.  dcb.Parity   = NOPARITY;
    6.  dcb.StopBits = ONESTOPBIT;
    7.  
    8.  dcb.fOutxCtsFlow    = FALSE;
    9.  dcb.fOutxDsrFlow    = FALSE;
    10.  dcb.fDsrSensitivity = FALSE;
    11.  dcb.fRtsControl     = RTS_CONTROL_TOGGLE;
    12.  dcb.fDtrControl     = DTR_CONTROL_HANDSHAKE;
    прочитал предварительно http://msdn.microsoft.com/en-us/library/ms810467 .
    Протокол - MODBUS. Точное соблюдение таймаутов на интервалы тишины неважно.
    Интересует такой случай:
    Код (Text):
    1. COMMTIMEOUTS Timeouts;
    где только (Timeouts.ReadIntervalTimeout != 0). Остальные - нули (чтобы по таймауту ReadIntervalTimeout выделить только фрейм).
    Поясню. Есть 255 (или любое другое количество) байт буфер. Вызываю ReadFile в него. Приходит 255 символов. Допустим обрабатываю их (предварительно), считая, что это нормальный фрейм MODBUS, но не шлю ответ, так как хочу убедиться, что фрейм на самом деле кончился (функция ReadFile возвратилась по событию заполнения всего буффера, а не по событию таймаута на межсимвольный интервал тишины).
    Если я вызову ReadFile ещё раз, то, когда она завершит своё выполнение, будет неясно - она приняла хвост того же самого фрейма, что приходил при предыдущем вызове, или это новый фрейм. А соответственно неясно нужно ли обрабатывать их оба, или ни одного.
    Извиняюсь за то, что развёл демагогию). Буду благодарен за ответы.
     
  2. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    А XON/XOFF не прокатят, чтобы не клевать мозги с таймаутами?
     
  3. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
  4. VaStaNi

    VaStaNi Member

    Публикаций:
    0
    Регистрация:
    1 июн 2004
    Сообщения:
    203
    Адрес:
    Ukraine
    Тебе ОБЯЗАТЕЛЬНО нужно вкурить асинхронный режим работы(программирование, инициализация на событие и пр.) под Win32
    Когда то я почерпнул массу этого зелья из великолепной статьи
    "Работа с коммуникационными портами (COM и LPT) в программах для Win32"
    как говорится сам изучи и другому передай, который будет мучаться после тебя такими же проблемсами. Гуглится по названию во многих местах.
    Вот 2 прямые дорожки:
    http://atf.vstu.ru/downloads/e_books/hard/work_with_communication_ports.pdf
    http://www.realcoding.net/article/view/2416
    Забегая наперед скажу, что пока не будет у тебя работа с OVERLAPPED + WaitForSingleObject для твоих ReadFile и WriteFile ничего путного ожидать не следует.
    В принципе придется еще дополнительно курить мануалы по этим вещам и их разновидностям, но это потом, по прочтении, удивлении, радости.....
    Еще посоветую познакомиться, а может быть просто забить на свои потоги и использовать MODBUS компоненту есть такая за бенежку и ломаная называется ModLink. Про сорцы не помню, врядли, она давно продается за неск сот зелени, но есть робингудовские крекнутые. Короче почитай про нее, мож самое то,погугли, сходи скажем сюда http://dumpz.ru/%E8%ED%F1%F2%F0%F3%EC%E5%ED%F2%E0%F0%E8%E9-112/%EA%EE%EC%EF%EE%ED%E5%ED%F2%FB-%EA-delphi-%EA%E0%F2%E0%EB%EE%E3-%F1%F1%FB%EB%EE%EA-4-a-52340/index42.html#post553253
    http://www.ozm.cz/ivobauer/modlink/introduction.htm
    иногда лучше учиться на хороших примерах, чем долбиться, поэтому еще посоветую компортовые вещи
    TMS Async32 и TurboPower Async Professional (тут все грамотно реализовано, как по статье и много поточность и неблокирующими механизмами)
    http://sourceforge.net/projects/tpapro/files/
     
  5. Dukales

    Dukales New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2009
    Сообщения:
    199
    drmad
    Да. Именно так. (dcb.fBinary == TRUE).
    VaStaNi
    Спасибо большое (я уже читал эту статью). Поясните насчёт overlapped. Я все функции знаю, но к тому, что
    так неотвратимо необходим я не пришёл. Лучше таймауты+синхронный ReadFile в потоке.
    Мне необходима пара WriteFile (запрос) -> ReadFile (ответ). С таймаутами.