Windows 11 тормозит обмены через СОМ-порт

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

Также необходимо учитывать, что Установка работает 12-24/7 и доступ к ее телу у меня есть в технологические, а также обед/ужин перерывы. Соответственно предложения, требующие фундаментальной модернизации Установки (или существенного расширения моих знаний и умений) прекрасны, но на практике нереализуемы.

По сути - есть предположение, что ошибка синхронная передача TBComPort работает немного не так, как я понял из справки.

У меня складывается впечатление, что событие наступает раньше, чем изменение Port0.Parity оказывает влияние на паритет передаваемого байта.

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

При таком обработчике события OnTxEmpty сбои в обменен имеют место быть:

DelphiВыделить код

1
2

Procedure TForm0.Port0TxEmpty(Sender:TObject);
  Begin If TimeForTx then Begin Port0.Parity:=paMark; Port0.Write(ByteTx,NumTx); TimeForTx:=false; End; End;

Если же вставить Sleep(1), то сбоев нет.

DelphiВыделить код

1
2

Procedure TForm0.Port0TxEmpty(Sender:TObject);
  Begin If TimeForTx then Begin Sleep(1); Port0.Parity:=paMark; Port0.Write(ByteTx,NumTx); TimeForTx:=false; End; End;

И да, Sleep(1) - это только, чтобы быстро проверить идею.

П.С. Win 11 пока реабилитирована.

П.П.С. Контроллер (писал сам, поэтому верю) все же быстрее, чем СОМ порт, поэтому быстрота нового компа, компенсируется медленной (хоть и 115200) скоростью обмена.

Добавлено через 1 час 25 минут

П.П.С. Т.к. не верю никому проверил длительность задержки Sleep(n);

DelphiВыделить код

1
2
3

 QueryPerformanceFrequency(Fr); QueryPerformanceCounter(T1);/////
  Sleep(n);////
  QueryPerformanceCounter(T2);/////

Задержка, в мс, вычисляется по формуле: Delay=1000*(T2-T1)/Fr

При n=1, Delay=0.161 - 1.091 мс;

При n=2, Delay=1.194 - 2.025 мс;

При n=3, Delay=2.182 - 3.050 мс;

Delphi 7, Win 7. Вроде почти все честно.