Форум: Техническая поддержка

Тема: Синий экран при принудительном завершении ПО через Диспетчер задач

Вы не вошли.

 Поиск | Регистрация | Вход 

Федор Спиридонов
11.07.2023 19:45:10
#1

Гость

Синий экран при принудительном завершении ПО через Диспетчер задач

Возникает "синий экран" при принудительном завершении работы ПО через диспетчер задач. Программное обеспечение падает при использовании функции OpenLDevice() библиотеки Lusbapi.dll. При этом консольное приложение представленное в качестве примера ведет себя аналогично. Пример использовался со страницы: https://www.lcard.ru/forums/viewtopic.php?id=9946. Приложение использовалось для взаимодействия с устройством е14-440, написано на языке С++, Fraemwork Qt.

12.07.2023 22:07:33
#2

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,479

Re: Синий экран при принудительном завершении ПО через Диспетчер задач

1. Какая операционная система?
2. Надеюсь при установке  USB драйверов была использована последняя версия пакета LComp с нашего сайта.
3. Присылайте проект Вашего консольного  примера. Будем посмотреть...

Федор Спиридонов
18.07.2023 07:29:14
#3

Гость

Re: Синий экран при принудительном завершении ПО через Диспетчер задач

1. Операционная система Windows 7 x64
2. Версия драйвера 6.0.2.5 от 20.12.2011
3. Пример ПО:

#include <stdio.h>
#include <conio.h>
#include <iostream>
#include "Lusbapi.h"
#include <cstring>
#include <iomanip>

#define CHANNELS_QUANTITY			(0x4)

// аварийный выход из программы
void AbortProgram(char *ErrorString, bool AbortionFlag = true);

// версия библиотеки
DWORD DllVersion;
// указатель на интерфейс модуля
ILE440 *pModule;
// дескриптор устройства
HANDLE ModuleHandle;
// название модуля
char ModuleName[7];
// скорость работы шины USB
BYTE UsbSpeed;
// структура с полной информацией о модуле
MODULE_DESCRIPTION_E440 ModuleDescription;
// структура параметров работы АЦП модуля
ADC_PARS_E440 ap;

// отсчёты АЦП
SHORT AdcSample1, AdcSample2, AdcSample3, AdcSample4;
// индекс входного диапазона напряжения
const WORD InputRangeIndex = ADC_INPUT_RANGE_2500mV_E440;

//------------------------------------------------------------------------
// основная программа
//------------------------------------------------------------------------

int main()
{
//------------------------------------------------------------------------

  WORD i;

  // зачистим экран монитора

  printf(" *********************************\n");
  printf(" Module E14-440                   \n");
  printf(" Console example AdcSample stream \n");
  printf(" *********************************\n\n");

  // проверим версию используемой библиотеки Lusbapi.dll
  if((DllVersion = GetDllVersion()) != CURRENT_VERSION_LUSBAPI)
  {
          char String[128];
          sprintf(String, " Lusbapi.dll Version Error!!!\n   Current: %1u.%1u. Required: %1u.%1u",
                                                                                  DllVersion >> 0x10, DllVersion & 0xFFFF,
                                                                                  CURRENT_VERSION_LUSBAPI >> 0x10, CURRENT_VERSION_LUSBAPI & 0xFFFF);

          AbortProgram(String);
  }
  else printf(" Lusbapi.dll Version --> OK\n");

  // попробуем получить указатель на интерфейс
  pModule = static_cast<ILE440 *>(CreateLInstance("e440"));
  if(!pModule) AbortProgram(" Module Interface --> Bad\n");
  else printf(" Module Interface --> OK\n");

  // попробуем обнаружить модуль E14-440 в первых MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI виртуальных слотах
  for(i = 0x0; i < MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI; i++) if(pModule->OpenLDevice(i)) break;
  // что-нибудь обнаружили?
  if(i == MAX_VIRTUAL_SLOTS_QUANTITY_LUSBAPI) AbortProgram(" Can't find any module E14-440 in first 127 virtual slots!\n");
  else printf(" OpenLDevice(%u) --> OK\n", i);

  // попробуем прочитать дескриптор устройства
  ModuleHandle = pModule->GetModuleHandle();
  if(ModuleHandle == INVALID_HANDLE_VALUE) AbortProgram(" GetModuleHandle() --> Bad\n");
  else printf(" GetModuleHandle() --> OK\n");

  // прочитаем название модуля в обнаруженном виртуальном слоте
  if(!pModule->GetModuleName(ModuleName)) AbortProgram(" GetModuleName() --> Bad\n");
  else printf(" GetModuleName() --> OK\n");
  // проверим, что это 'E14-440'
  if(strcmp(ModuleName, "E440")) AbortProgram(" The module is not 'E14-440'\n");
  else printf(" The module is 'E14-440'\n");

  // попробуем получить скорость работы шины USB
  if(!pModule->GetUsbSpeed(&UsbSpeed)) AbortProgram(" GetUsbSpeed() --> Bad\n");
  else printf(" GetUsbSpeed() --> OK\n");
  // теперь отобразим скорость работы шины USB
  printf("   USB is in %s\n", UsbSpeed ? "High-Speed Mode (480 Mbit/s)" : "Full-Speed Mode (12 Mbit/s)");

  // код LBIOS'а возьмём из соответствующего ресурса штатной DLL библиотеки
  if(!pModule->LOAD_MODULE()) AbortProgram(" LOAD_MODULE() --> Bad\n");
  else printf(" LOAD_MODULE() --> OK\n");

  // проверим загрузку модуля
  if(!pModule->TEST_MODULE()) AbortProgram(" TEST_MODULE() --> Bad\n");
  else printf(" TEST_MODULE() --> OK\n");

  // получим информацию из ППЗУ модуля
  if(!pModule->GET_MODULE_DESCRIPTION(&ModuleDescription)) AbortProgram(" GET_MODULE_DESCRIPTION() --> Bad\n");
  else printf(" GET_MODULE_DESCRIPTION() --> OK\n");

  // получим текущие параметры работы АЦП
  if(!pModule->GET_ADC_PARS(&ap)) AbortProgram(" GET_ADC_PARS() --> Bad\n");
  else printf(" GET_ADC_PARS() --> OK\n");

  // установим желаемые параметры работы АЦП
  ap.IsCorrectionEnabled = true;   // разрешим корректировку данных на уровне драйвера DSP
  ap.InputMode = NO_SYNC_E440;	   // обычный сбор данных безо всякой синхронизации ввода
  ap.ChannelsQuantity = CHANNELS_QUANTITY;// четыре активных канала
  // формируем управляющую таблицу
  for(i = 0x0; i < ap.ChannelsQuantity; i++)
          ap.ControlTable[i] = (WORD)(i | (InputRangeIndex << 0x6));
  ap.AdcRate = 100.0;									// частота работы АЦП в кГц
  ap.InterKadrDelay = 0.0;							// межкадровая задержка в мс
  ap.AdcFifoBaseAddress = 0x0;			  			// базовый адрес FIFO буфера АЦП в DSP модуля
  ap.AdcFifoLength = MAX_ADC_FIFO_SIZE_E440;	// длина FIFO буфера АЦП в DSP модуля
  // будем использовать фирменные калибровочные коэффициенты, которые храняться в ППЗУ модуля
  for(i = 0x0; i < ADC_CALIBR_COEFS_QUANTITY_E440; i++)
  {
          ap.AdcOffsetCoefs[i] =  ModuleDescription.Adc.OffsetCalibration[i];
          ap.AdcScaleCoefs[i] =  ModuleDescription.Adc.ScaleCalibration[i];
  }

  // передадим требуемые параметры работы АЦП в модуль
  if(!pModule->SET_ADC_PARS(&ap)) AbortProgram(" SET_ADC_PARS() --> Bad\n");
  else printf(" SET_ADC_PARS() --> OK\n");

  // отобразим параметры модуля на экране монитора
  printf(" \n\n");
  printf(" Module E14-440 (S/N %s) is ready ... \n", ModuleDescription.Module.SerialNumber);
  printf("   Module Info:\n");
  printf("     Module  Revision   is '%c'\n", ModuleDescription.Module.Revision);
  printf("     AVR Driver Version is %s (%s)\n", ModuleDescription.Mcu.Version.Version, ModuleDescription.Mcu.Version.Date);
  printf("     LBIOS   Version    is %s (%s)\n", ModuleDescription.Dsp.Version.Version, ModuleDescription.Dsp.Version.Date);
  printf("   Adc parameters:\n");
  printf("     Data Correction is %s\n", ap.IsCorrectionEnabled ? "enabled" : "disabled");
  printf("     Input Range  = %6.2f Volt\n", ADC_INPUT_RANGES_E440[InputRangeIndex]);

  printf("\n Press any key if you want to terminate this program...\n");
  // цикл перманентного выполнения функции ADC_SAMPLE и
  // отображения полученных данных на экране диплея
  printf("\n\n");
  printf(" ADC Channel:                     1         2         3         4\n");
  while(!kbhit())
  {
          if(!pModule->ADC_SAMPLE(&AdcSample1, (WORD)(0x00 | (InputRangeIndex << 6))))
            {
              printf("\n\n  ADC_SAMPLE(, 0) --> Bad\n");
              break;
            }
          else if(!pModule->ADC_SAMPLE(&AdcSample2, (WORD)(0x01 | (InputRangeIndex << 6))))
            {
              printf("\n\n  ADC_SAMPLE(, 1) --> Bad\n");
              break;
            }
          else if(!pModule->ADC_SAMPLE(&AdcSample3, (WORD)(0x02 | (InputRangeIndex << 6))))
            {
              printf("\n\n  ADC_SAMPLE(, 2) --> Bad\n");
              break;
            }
          else if(!pModule->ADC_SAMPLE(&AdcSample4, (WORD)(0x03 | (InputRangeIndex << 6))))
            {
              printf("\n\n  ADC_SAMPLE(, 3) --> Bad\n");
              break;
            }


          printf(" AdcSample Data (ADC code):     %5d     %5d     %5d     %5d\r", AdcSample1, AdcSample2,AdcSample3,AdcSample4);
  }

  // освободим интерфейс модуля
  printf("\n\n");
  AbortProgram(" The program was completed successfully!!!\n", false);

//------------------------------------------------------------------------
        return 0;
}

//------------------------------------------------------------------------
// аварийное завершение программы
//------------------------------------------------------------------------
void AbortProgram(char *ErrorString, bool AbortionFlag)
{
	// подчищаем интерфейс модуля
	if(pModule)
	{
		// освободим интерфейс модуля
		if(!pModule->ReleaseLInstance()) printf(" ReleaseLInstance() --> Bad\n");
		else printf(" ReleaseLInstance() --> OK\n");
		// обнулим указатель на интерфейс модуля
		pModule = NULL;
	}

	// выводим текст сообщения
	if(ErrorString) printf(ErrorString);

	// прочистим очередь клавиатуры
	if(kbhit()) { while(kbhit()) getch(); }

	// если нужно - аварийное завершаем программу
	if(AbortionFlag) exit(0x1);
	// или спокойно выходим из функции
	else return;
}
19.07.2023 21:20:41
#4

Сотрудник "Л Кард"
Здесь с 24.04.2014
Сообщений: 1,479

Re: Синий экран при принудительном завершении ПО через Диспетчер задач

Срочно обновляйте USB драйвера с нашего сайта.
Для корректной установки указанных USB драйверов в Windows'7 требуется обязательное наличие в системе следующих обновлений:
a. "Первый пакет обновлений" (Service Pack 1);
b.  Обновление KB3033929.

Контакты

Адрес: 117105, Москва, Варшавское шоссе, д. 5, корп. 4, стр. 2

Многоканальный телефон:
+7 (495) 785-95-25
Факс: +7 (495) 785-95-14

Отдел продаж: sale@lcard.ru
Техническая поддержка: support@lcard.ru

Время работы: с 9-00 до 19-00 мск