
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[216.73.216.75] |
![]() |
|
Сообщ.
#1
,
|
|
|
Работаю с СОМ портом. Периодически возникает ошибка 995 "The I/O operation has been aborted because of either thread exit or an application request"
лечится закрытием о открытием порта заново. Но я так думаю, что это не правильно. Как побороть? Или так и должно быть? |
Сообщ.
#2
,
|
|
|
Мы тоже можем гадать почему такое происходит
|
Сообщ.
#3
,
|
|
|
Ну что ж, гадаем: предполагаю, что ты прибиваешь поток, в котором работаешь с искомым портом, с помощью TerminateThread.
Добавлено А так у тебя есть как минимум три варианта: 1. Искать причину самому. 2. Подробно описать алгоритм взаимодействия с портом. 3. Запортить сюда соответствующий кусок кода. Добавлено Также есть подозрение, что автор о ClearCommError не слышал, хотя ее использование в данной ситуации все равно будет костылем. |
Сообщ.
#4
,
|
|
|
Цитата shm @ Ну что ж, гадаем: предполагаю, что ты прибиваешь поток, в котором работаешь с искомым портом, с помощью TerminateThread. Добавлено А так у тебя есть как минимум три варианта: 1. Искать причину самому. 2. Подробно описать алгоритм взаимодействия с портом. 3. Запортить сюда соответствующий кусок кода. Добавлено Также есть подозрение, что автор о ClearCommError не слышал, хотя ее использование в данной ситуации все равно будет костылем. Искал причину сам, и вот что обнаружил. Есть две программки, которые обмениваются по 422 порту сообщениями. Если запущены обе и идет обмен, то через некотоое время при управлении потоком чтения, возникает ошибка 995. Если запустить только одну программку, ту в которой возникает эта ошибка 995, она работает без ошибок, деже при многократном управлении процессом обмена. Управление обменом состоит в включении и выключении выполнения куска кода анализа принятого сообщения. Не могу приатачить код, не позволяют секретные службы нашего концерна. |
Сообщ.
#5
,
|
|
|
Ну в чтении порта ничего секретного нету.
|
Сообщ.
#6
,
|
|
|
Нашел в интернете документик
"Работа с коммуникационными портами (COM и LPT) в программах для Win32" В котором в частности описана функция ![]() ![]() BOOL ClearCommError( HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat ); И о чудо, я получил причину моей ошибки. Оказалось, что у меня переполняется приемный буфер! Длина моего сообщение 4018 байт, а буфер имеет длину 4096 байт. Отсюда вопрос, как правильно определить необходимую длину буфера? |