Немного истории: у нас есть приложение, которое изначально было написано много лет назад (1998 год - первое свидание в PVCS, но приложение примерно на 5 лет старше, чем оно изначально было программой DOS). Это приложение связывается с частью оборудования через последовательный порт. Когда мы добрались до Windows XP, мы начали получать сообщения о смерти приложения после короткого времени работы. Кажется, что последовательная связь просто «умерла», и приложение осталось в застрявшем состоянии. Единственный способ выхода из этой ситуации - перезапустить приложение.
Единственной информацией, которую я могу найти относительно этой проблемы, было, очевидно, то, что система сообщений Windows пропустит получение этой информации, заполнит буфер и система зависнет. Этот фрагмент информации был оставлен в старом текстовом документе, но нет никаких доказательств, подтверждающих это. Также упоминается, что это распространено только на высоких скоростях передачи (115200+).
Решением было предоставить клиентам USB-> последовательные преобразователи вместе с аппаратным обеспечением.
Сегодня: мы работаем над новой версией оборудования, которое будет работать как по сети, так и по последовательным портам. Поэтому, чтобы я мог работать с сетевым кодом, за исключением реального оборудования, которое мы используем, устройство VSCOM NetCom113 . Он также устанавливает виртуальный коммуникационный порт на компьютере пользователя (то есть: мой).
Теперь у меня есть сетевой код, интегрированный с приложением. Похоже, что устройство NetCom демонстрирует то же поведение, что и физическое устройство. Это нежелательно, так как мне нужно, чтобы приложение работало дольше, чем ~ 30 секунд.
Google обнаруживает ноль проблем, с которыми мы сталкиваемся.
Мне было интересно:
- Кто-нибудь испытывал это раньше? Если да, что вы сделали, чтобы исправить / обойти проблему?
- Есть ли у кого-нибудь какие-либо предложения относительно правильности первоначального автора документа и что я могу сделать, чтобы проверить теорию?
К сожалению, я не могу опубликовать код, поскольку серийный код тесно связан с остальной частью системы, хотя, если у вас есть вопросы по этому поводу, я могу ответить на вопросы об этом.
Обновление:
- Код написан с использованием подпрограмм Win32 Comm - поэтому я использую CreateFile, ReadFile. Также есть разумные вызовы GetOverlappedResult.
- Оно не висит само по себе, просто прекращается связь. Вы можете получить доступ к меню, нажать кнопки, но ничто не может взаимодействовать с подключенным оборудованием. Используя realterm , вы можете видеть, что данные не поступают и не выходят.
- Я думаю, что ссылка на сообщение Windows заключается в том, что проблема связана с Windows. Данные поступили, но ядро пропустило их и, таким образом, не сообщило об этом остальной системе.
- Управление потоком не используется.
- Написание «простого» теста затруднительно из-за того, что код тесно связан, а базовый протокол довольно сложен и потребует много работы.