|
|
|
|

При чтении сом порта возникает ошибка 995, как побороть?
- Подписаться на тему
- Сообщить другу
- Скачать/распечатать тему
|
|
|
|
Full Member
Рейтинг (т): 1 |
Работаю с СОМ портом. Периодически возникает ошибка 995 «The I/O operation has been aborted because of either thread exit or an application request» |
|
Dem_max |
|
|
Мы тоже можем гадать почему такое происходит |
|
shm |
|
|
Ну что ж, гадаем: предполагаю, что ты прибиваешь поток, в котором работаешь с искомым портом, с помощью TerminateThread. Добавлено 04.03.13, 09:58 Добавлено 04.03.13, 10:06 |
|
a_n_y_a |
|
|
Full Member
Рейтинг (т): 1 |
Цитата shm @ 04.03.13, 09:56 Ну что ж, гадаем: предполагаю, что ты прибиваешь поток, в котором работаешь с искомым портом, с помощью TerminateThread. Добавлено 04.03.13, 09:58 Добавлено 04.03.13, 10:06
Искал причину сам, и вот что обнаружил. Есть две программки, которые обмениваются по 422 порту сообщениями. |
|
Dem_max |
|
|
Ну в чтении порта ничего секретного нету. |
|
a_n_y_a |
|
|
Full Member
Рейтинг (т): 1 |
Нашел в интернете документик
BOOL ClearCommError( HANDLE hFile, LPDWORD lpErrors, LPCOMSTAT lpStat ); И о чудо, я получил причину моей ошибки. Оказалось, что у меня переполняется приемный буфер! Длина моего сообщение 4018 байт, а буфер имеет длину 4096 байт. |
0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
0 пользователей:
- Предыдущая тема
- C/C++: Системное программирование и WinAPI
- Следующая тема
[ Script execution time: 0,0234 ] [ 16 queries used ] [ Generated: 28.01.23, 17:30 GMT ]
- Remove From My Forums
-
Question
-
hi,
Iam working on windowsxp with vc7. At times when i try to access the com port and read some value, there is an error 995, returned by GetLastError().
the com port is openned using winapi createfile.
I’ve also set the flag…
dcb.fAbortOnError=1;
Can somebody please let me know why this happenns and any possible solution for this.
Thanks,
Srikanth.
Answers
-
I have not used fAbortOnError myself, but have you tried using ClearCommError to clear any comms errors such as parity, overrun etc.
What I have found is that unless ClearCommError is checked on a regular basis, reads/writes after a comms error will fail.
-
The first thing to do is to determine what 995 means. You can get that done for you automatically by your program using the FormatMessage function. Or you can use the Error Lookup tool in VS. Or you can open winerror.h and find error 995 there. The advantage of winerror.h is that you can also determine the symbolic name for the error code; for 995 it is ERROR_OPERATION_ABORTED.
Using ERROR_OPERATION_ABORTED you can search the MSDN for explanations and examples. Based on the description of the error, I think it is necessary to know the context of the error to answer your questions.
Я искал stackoverflow и тщательно искал эту проблему, но не смог найти ключ к тому, почему эта проблема происходит.
Я пишу программу на С++, которая общается с измерительным устройством, подключенным через USB. Программа многопоточна, и несколько потоков будут взаимодействовать с устройством. Мьютекс используется, чтобы гарантировать, что ни одна из двух потоков не пытается читать или писать с устройства в одно и то же время.
Команды отправляются на устройство с помощью WriteFile, а ответы и измеренные значения считываются с помощью ReadFile — обе операции выполняются синхронно.
Иногда при чтении измеренного значения с устройства произойдет сбой измерения с тайм-аутом (GetLastError() возвращает код ошибки 121) из-за ошибки синхронизации внутри самого измерительного устройства — это нормально и ожидаемо.
Когда я пытаюсь продолжить измерение, посылая новую команду, WriteFile иногда (примерно 50% времени) терпит неудачу, а GetLastError() возвращает код ошибки 995, который описан в MSDN как:
ERROR_OPERATION_ABORTED
995 (0x3E3)
The I/O operation has been aborted because of either a thread exit or an application request.
После истечения таймаута нет потока, и отменить операцию чтения или записи невозможно. Я могу возобновить связь только путем закрытия и повторного открытия связи с устройством с помощью CloseHandle и CreateFile. Однако это займет некоторое время от измерения и не является идеальным решением.
Мой вопрос: почему WriteFile возвращает код ошибки 995 в этом случае и что я могу сделать, чтобы не закрывать и не открывать связь с устройством?
Данные ошибки связаны с созданием резервной копии (Backup).
Рассмотрим сначала ошибку 995 и 1003
Может возникнуть на 32-битной операционной системе.
Примеры ошибок:
- 995(The I/O operation has been aborted because of either a thread exit or an application request.)
- 995(failed to retrieve text for this error. Reason: 1815)
- 1003(Не удается завершить выполнение функции.)
Решение:
- Основная причина данных ошибок — проблема с создание backup, поэтому следует внимательно посмотреть весь механизм его создания и найти причину ошибок
- Возможно поможет запустить сервер с параметром -g 384 (для SQL SERVER 2000) или -g 512 (для SQL SERVER 2005), желательно чтобы было более 2 Gb памяти
- Перезагрузить SQL SERVER
Вернёмся к SQLVDI
Причины возникновения:
- Таймаут процесса backup
- Не хватает прав доступа
- На больших БД, когда делается VSS (Volume Shadow Copy Service)
- Плохой код сторонней программы, которая неверно работает с dll — SQLVDI.dll
- Старая версия SQLVDI.dll
Примеры ошибок:
- ‘SQLVDI’ EventID 1: SQLVDI: Loc=SignalAbort. Desc=Client initiates abort. ErrorCode=(0). Process=6396. Thread=6816. Client. Instance=. VD=GlobalTDPSQL-000018FC-0000_SQLVDIMemoryName_0.
- ‘SQLVDI’ EventID 1: SQLVDI: Loc=SignalAbort. Desc=Client initiates abort. ErrorCode=(0). Process=5896. Thread=2860. Client. Instance=SQLDB02. VD=GlobalTDPSQL-00001708-0000_SQLVDIMemoryName_0.
Способы решения проблемы:
- Обновить SQL Server. В частности могут помочь следующие KB (KB934396,KB936305,KB50000895). Найти все KB можно по этой ссылке
- Зарегистрировать последнюю версию SQLVDI.dll и зарегистрировать её в системе. Для этого необходимо Пуск >> Выполнить >> RegSrv32 путьSQLVDI.dll. По-умолчанию устанавливается в C:Program FilesMicrosoft SQL Server80COM
- Посмотрите дополнительную информацию в SQL Server ERROR.LOG
- Данный способ Backup использует VSS (Volume Shadow Copy Service), поэтому имеет смысл проверить его статус. Для этого выполните под правами администратора Пуск >> Выполнить >> vssadmin list writers >> убедиться в отсутствии ошибок в выводе и в наличии последней версии ПО
Запись опубликована в рубрике Мониторинг с метками error. Добавьте в закладки постоянную ссылку.
I have searched stackoverflow and googled thoroughly for this problem but not been able to find a clue to why this problem is happening.
I am writing a program in C++ which communicates with a measurement device connected through USB. The program is multithreaded and several threads will communicate with the device. A mutex is used to guarantee that no two threads try to read or write from the device at the same time.
Commands are sent to the device using WriteFile and the responses and measured values are read using ReadFile — both operations are done synchronously.
Sometimes while reading the measured value from the device will the measurement fail with a timeout (GetLastError() returns error code 121), due to a synchronization error inside the measurement device itself — which is ok and expected.
When I try to continue the measurement, by sending a new command will WriteFile sometimes (roughly 50% of the time) fail and GetLastError() returns the error code 995 which is described in MSDN as:
ERROR_OPERATION_ABORTED
995 (0x3E3) The I/O operation has been aborted because of either a thread exit or an application request.
There is no thread exit after the timeout occurs and there is no cancel of any read or write operation. I am able to resume the communication only by closing and re-opening the communication with the device using CloseHandle and CreateFile. However, this will take some time from the measurement and is not an ideal solution.
My question is, why does WriteFile return the error code 995 in this case, and what can I do to avoid having to close and re-open the communication with the device?
Добрый день!
Помогите решить проблему.
Версия KKM web-сервер: 2.1.28.10
Обновление ПО и драйверов терминала от 30.05.2019
При запуске KKM не проходит инициализация устройства. В логах
![]()
В логах терминала:
Код: Выделить всё
31.05 17:38:19 PILOT: GATE.DLL loaded
31.05 17:38:19 GATE: lock:'0000059C' 'UPOSWINMUTEX2'
31.05 17:38:19 SBKRNL: Open com 4
31.05 17:38:20 SBKRNL: Close com 4
31.05 17:38:20 GATE: unlock:'0000059C'
31.05 17:38:20 PILOT: Auxiliary func 13: result=0
31.05 17:38:20 PILOT: Unloading GATE.DLL...
31.05 17:38:20 GATE: SB_KERNEL.DLL is unloaded
31.05 17:38:20 GATE: UPDATER.DLL is unloaded
31.05 17:38:20 PILOT: GATE.DLL unloaded
Далее, из интерфейса сервера проводится тестовый платеж, который завершается ошибкой. При этом на терминале выводится предложение об оплате картой с тестовой суммой.
Ошибка KKM
Код: Выделить всё
{
"CardNumber": "",
"ReceiptNumber": "",
"RRNCode": "",
"AuthorizationCode": "",
"Slip": "",
"PrintSlipOnTerminal": false,
"Amount": 0,
"Command": "PayByPaymentCard",
"Error": "Message: Ошибка вызова функции '_card_authorize8' в dll, Error # Внешний компонент создал исключение..Message: Ошибка вызова функции '_card_authorize8' в dll, Error # Внешний компонент создал исключение..",
"Warning": "",
"Status": 2,
"IdCommand": "5103ce97-49a5-eed3-042f-b35d7e2256e8",
"NumDevice": 2
}
Логи терминала
Код: Выделить всё
31.05 17:51:03 PILOT: card_authorize8: track2=(null), TRType=1, CType=0, Amount=100
31.05 17:51:03 PILOT: Dump[000..173):0100000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
31.05 17:51:03 PILOT: Loading GATE.DLL
31.05 17:51:03 GATE: SB_KERNEL.DLL is loaded
31.05 17:51:03 GATE: UPDATER.DLL is loaded
31.05 17:51:03 GATE: lock:'000005E8' 'UPOSWINMUTEX2'
31.05 17:51:03 GATE: unlock:'000005E8'
31.05 17:51:03 PILOT: GATE.DLL loaded
31.05 17:51:03 GATE: lock:'00000414' 'UPOSWINMUTEX2'
31.05 17:51:03 SBKRNL: Command = 4000, Amount = 1.00
31.05 17:51:03 SBKRNL: Open com 4
31.05 17:51:04 SBKRNL: Session -1764398827 was aborted. Try to restore last session result.
31.05 17:51:04 PILOT: Unloading GATE.DLL...
31.05 17:51:04 GATE: SB_KERNEL.DLL is unloaded
31.05 17:51:04 GATE: UPDATER.DLL is unloaded
31.05 17:51:04 PILOT: GATE.DLL unloaded
После, любые действия с терминалом невозможны.
После отмены оплаты на терминале, попытка вызвать оплату еще раз.
Код ошибки KKM
Код: Выделить всё
{
"CardNumber": "",
"ReceiptNumber": "",
"RRNCode": "",
"AuthorizationCode": "",
"Slip": "",
"PrintSlipOnTerminal": false,
"Amount": 0,
"Command": "PayByPaymentCard",
"Error": "115 (Ошибка иниц.) : Неизвестный код ошибки",
"Warning": "",
"Status": 2,
"IdCommand": "468a4772-8b70-3934-29fe-61e9e9187a8e",
"NumDevice": 2
}
Лог терминала.
Код: Выделить всё
31.05 17:56:24 PILOT: card_authorize8: track2=(null), TRType=1, CType=0, Amount=100
31.05 17:56:24 PILOT: Dump[000..173):0100000064000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
31.05 17:56:24 PILOT: Loading GATE.DLL
31.05 17:56:24 GATE: SB_KERNEL.DLL is loaded
31.05 17:56:24 GATE: UPDATER.DLL is loaded
31.05 17:56:29 GATE: lock failed:'00000318' 'UPOSWINMUTEX2'
31.05 17:56:29 GATE: unlock:'00000318'
31.05 17:56:29 PILOT: GATE.DLL busy. Please complete previous operation.
31.05 17:56:29 PILOT: Unloading GATE.DLL...
31.05 17:56:29 GATE: SB_KERNEL.DLL is unloaded
31.05 17:56:29 GATE: UPDATER.DLL is unloaded
31.05 17:56:29 PILOT: GATE.DLL unloaded
31.05 17:56:29 PILOT: card_authorize8: result=115, RC=99, cheque=No, vas=0
31.05 17:56:29 PILOT: Dump[000..173):0100000064000000393900CEF8E8E1EAE020E8EDE8F62E000000000000000000000000000000000000000000000000000000000000000000000000000000000000000063000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000


