Цитата(rezident)
когда вы цитируете кого-то, то указывайте автора цитаты
Остается поблагодарить за раскрытие секретов мастерства.
Цитата(defunct)
Самое плохое это то, что винда может втавлять непредсказуемые паузы внутри пакетов
Если пакет достаточно длинный. В современных РС СОМ обычно интегрирован в чипсет и поэтому может отличатся от стандартного. Глубина ФИФО, как я ка то обнаружил экспериментальным путем, не соответствует стандартным 16 байтам, а обычно имеет совершенно левое значение. Чтобы узнать глубину фифо, надо соединить на COM'e RX и TX и сначала записать в него чего-нибудь большое, а потом считать. Считается столько, сколько осталось в ФИФО. Я прпробовал на двум мамках - на одной оказался 91 байт, на другой - 173. Если длина пакета менее длины ФИФО, паузы не будет.
А если не привязываться к ФИФО, то минимизировать вероятность появления пауз можно только путе повышения приоритета и соответствующей настройки СОМа.
Движок для слейва на МК под РС485 с использованием пауз для определения старта пакета может выглядеть следующим образом:
Используется аппаратный таймер и УАРТ.
Флаг переполнения таймера используется как признак адреса. При инициализации сбрасывается.
Время на таймере устанавливается при инициализации и при приеме любого байта равным требуемый интервал + время приема 1 байта.
Обработчик прерывания по УАРТ, после взвода таймера, анализирует флаг переполнения таймера и, если он установлен, то он сбрасывается и происходит анализ принятого значения. Если оно совпадает с заданным адресом, то обработчик переходит в режим приема пакета. Если адрес не совпадает, то обработчик переходит в режим отвергания пакета.
Если при приеме байта флаг таймера сброшен, то обработчик проверяет режим работы и либо принимает пакет, либо вываливается.