2011-01-03 2 views
3

Есть ли лучший способ отправить последовательный перерыв, а затем последовательность setcommbreak - delay - clearcommbreak?Отправка (последовательный) перерыв с использованием окон (XP +) api

Я должен общаться с микроконтроллером, который использует последовательный разрыв как начало пакета на 115k2 и setcommbreak имеет две проблемы:

  • с 115k2, разрыв значительно ниже 1мс, и будет критически важным.

  • Поскольку разрыв должен быть встроен в поток пакетов в правильном положении, я ожидаю неприятностей с fifo.

Есть ли лучший способ сделать это, не перемещая последовательную связь нитью без fifo? UART обычно имеет значение 16550+

У меня есть выбор в том смысле, что настройка микроконтроллера может быть переключена (другая прошивка) на более условный пакетный формат, но руководство предупреждает, что способ «перерыв» включает проверку целостности оборудования серийного номера.

Компилятор - Delphi (2009/XE), но любой код или даже просто ссылка приветствуется.

+0

Не только fifo, то и буфер передачи драйвера. Вам нужно будет написать свой собственный драйвер, чтобы действительно сделать эту работу. Является ли это датским продуктом? Брось его, я знаю парня, и он - шарлатан. –

ответ

5

Короткий ответ, что серийное программирование с Windows, довольно ограничен :-(

Вы правы, что обычный способом отправки перерыва с SetCommBreak(), и да, вы должны обрабатывать задержку самостоятельно - что имеет тенденцию означать, что разрыв заканчивается значительно дольше, чем это должно быть. Хорошей новостью является то, что это обычно не имеет значения - большинство устройств, ожидающих перерыв, будут обрабатывать гораздо более длительный разрыв точно так же, как и короткий.

В случае, если ваш микроконтроллер is суетливый о точном времени перерыва, один из способов достижения более короткого, precis ely-defined break - изменить скорость передачи в бодах на более медленную скорость, отправить нулевой байт, а затем снова изменить его.

Причина, по которой это работает, заключается в том, что байт, отправленный на последовательный порт, отправляется как (обычно) один стартовый бит (нуль), за которым следуют биты в байте, за которым следуют один или несколько стоповых бит (высокие бит). «Разрыв» представляет собой последовательность нулевых битов, которая слишком длинна, чтобы быть байтом, то есть стоп-биты не приходят во времени. Выбирая более медленную скорость передачи и отправляя нуль, вы заканчиваете тем, что удерживаете линию в нуле дольше, чем приемник ожидает байта, поэтому он интерпретирует его как разрыв. (Вам решать, нужно ли определять скорость передачи в бодах для точного вычисления или пробной ошибки, что, по-видимому, микроконтроллер :-)

Конечно, любой способ (SetCommBreak() или изменение бода) требует от вас знать, когда все данные были отправлены из последовательного порта (т. е. в передающем FIFO ничего не осталось). Этот симпатичный article about Windows Serial programming описывает, как использовать SetCommMask(), WaitCommEvent() и т. Д., Чтобы определить это.

+0

Спасибо. Будут ли оба эти метода мешать получающим фило? Если это так, то это даже не стоит рассматривать. –

+0

Метод определения скорости будет мешать принимающему FIFO, если есть данные, полученные в одно и то же время - обычно это не так, поскольку «перерыв» используется для повторной синхронизации, но ваша ситуация может быть иной.Если это проблема (и это звучит так, как есть), то 'SetCommMask()' плюс 'SetCommBreak()' и друзья будут в безопасности. – psmears

+0

Спасибо, я отложил эту функцию на данный момент и начинаю с режима совместимости и начинаю строить тестовую базу/код для решения на основе разрыва –