Отправка (последовательный) разрыв с помощью API Windows (XP +) - PullRequest
3 голосов
/ 03 января 2011

Есть ли лучший способ отправить серийный разрыв, чем setcommbreak - delay - clearcommbreak sequence?

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

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

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

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

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

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

1 Ответ

5 голосов
/ 03 января 2011

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

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

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

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

Конечно, любой метод (SetCommBreak() или изменение скорости передачи) требует, чтобы вы знали, когда все данные были отправлены из последовательного порта (т. Е. В FIFO передачи ничего не осталось). В этой хорошей статье о последовательном программировании Windows описывается, как использовать SetCommMask(), WaitCommEvent() и т. Д., Чтобы определить это.

...