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