Программирование ЛИР-917
Модератор: Денис Кашин
Программирование ЛИР-917
Добрый день!
Пытаюсь управлять работой ЛИР-917 из Дельфи.
1. Инициализация проходит успешно (SI_SUCCESS):
if uHandle<>0 then
status := SI_Close(uHandle);
if status=SI_SUCCESS then
MessageDlg('Close: SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0);
2. Количество устройств определяется верно (1):
status := SI_GetNumDevices(NumDevices);
s:=IntToStr(NumDevices);
MessageDlg('Количество устройств:'+s,mtInformation,[mbYes],0);
3. Выбираю последнее устройство, как описано в примере на диске ЛИР-917:
DeviceNum := NumDevices - 1; // подключаемся к последнему устройству
4. Пытаюсь открыть устройство - ошибка "SI_INVALID_PARAMETER":
status := SI_Open(DeviceNum, uHandle);
s:=IntToStr(status);
MessageDlg('Результат открытия:'+s,mtInformation,[mbYes],0);
if status=SI_SUCCESS then
MessageDlg('SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_DEVICE_NOT_FOUND then
MessageDlg('SI_DEVICE_NOT_FOUND',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_READ_ERROR then
MessageDlg('SI_READ_ERROR',mtInformation,[mbYes],0)
else if status=SI_RX_QUEUE_NOT_READY then
MessageDlg('SI_RX_QUEUE_NOT_READY',mtInformation,[mbYes],0)
else if status=SI_WRITE_ERROR then
MessageDlg('SI_WRITE_ERROR',mtInformation,[mbYes],0)
else if status=SI_RESET_ERROR then
MessageDlg('SI_RESET_ERROR',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_INVALID_REQUEST_LENGTH then
MessageDlg('SI_INVALID_REQUEST_LENGTH',mtInformation,[mbYes],0)
else if status=SI_DEVICE_IO_FAILED then
MessageDlg('SI_DEVICE_IO_FAILED',mtInformation,[mbYes],0)
else if status=SI_INVALID_BAUDRATE then
MessageDlg('SI_INVALID_BAUDRATE',mtInformation,[mbYes],0)
else if status=SI_FUNCTION_NOT_SUPPORTED then
MessageDlg('SI_FUNCTION_NOT_SUPPORTED',mtInformation,[mbYes],0)
else if status=SI_GLOBAL_DATA_ERROR then
MessageDlg('SI_GLOBAL_DATA_ERROR',mtInformation,[mbYes],0)
else
MessageDlg('Результат неясен:'+s,mtInformation,[mbYes],0);
В чем может быть ошибка?
Пытаюсь управлять работой ЛИР-917 из Дельфи.
1. Инициализация проходит успешно (SI_SUCCESS):
if uHandle<>0 then
status := SI_Close(uHandle);
if status=SI_SUCCESS then
MessageDlg('Close: SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0);
2. Количество устройств определяется верно (1):
status := SI_GetNumDevices(NumDevices);
s:=IntToStr(NumDevices);
MessageDlg('Количество устройств:'+s,mtInformation,[mbYes],0);
3. Выбираю последнее устройство, как описано в примере на диске ЛИР-917:
DeviceNum := NumDevices - 1; // подключаемся к последнему устройству
4. Пытаюсь открыть устройство - ошибка "SI_INVALID_PARAMETER":
status := SI_Open(DeviceNum, uHandle);
s:=IntToStr(status);
MessageDlg('Результат открытия:'+s,mtInformation,[mbYes],0);
if status=SI_SUCCESS then
MessageDlg('SI_SUCCESS',mtInformation,[mbYes],0)
else if status=SI_DEVICE_NOT_FOUND then
MessageDlg('SI_DEVICE_NOT_FOUND',mtInformation,[mbYes],0)
else if status=SI_INVALID_HANDLE then
MessageDlg('SI_INVALID_HANDLE',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_READ_ERROR then
MessageDlg('SI_READ_ERROR',mtInformation,[mbYes],0)
else if status=SI_RX_QUEUE_NOT_READY then
MessageDlg('SI_RX_QUEUE_NOT_READY',mtInformation,[mbYes],0)
else if status=SI_WRITE_ERROR then
MessageDlg('SI_WRITE_ERROR',mtInformation,[mbYes],0)
else if status=SI_RESET_ERROR then
MessageDlg('SI_RESET_ERROR',mtInformation,[mbYes],0)
else if status=SI_INVALID_PARAMETER then
MessageDlg('SI_INVALID_PARAMETER',mtInformation,[mbYes],0)
else if status=SI_INVALID_REQUEST_LENGTH then
MessageDlg('SI_INVALID_REQUEST_LENGTH',mtInformation,[mbYes],0)
else if status=SI_DEVICE_IO_FAILED then
MessageDlg('SI_DEVICE_IO_FAILED',mtInformation,[mbYes],0)
else if status=SI_INVALID_BAUDRATE then
MessageDlg('SI_INVALID_BAUDRATE',mtInformation,[mbYes],0)
else if status=SI_FUNCTION_NOT_SUPPORTED then
MessageDlg('SI_FUNCTION_NOT_SUPPORTED',mtInformation,[mbYes],0)
else if status=SI_GLOBAL_DATA_ERROR then
MessageDlg('SI_GLOBAL_DATA_ERROR',mtInformation,[mbYes],0)
else
MessageDlg('Результат неясен:'+s,mtInformation,[mbYes],0);
В чем может быть ошибка?
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
Все может быть.
После замены описания в файле SiUSBXp на
function SI_Open(
DeviceNum: DWORD;
Handle: pointer
): SI_STATUS; stdcall; external 'SiUSBXp.dll';
(Thandle заменен на pointer)
и вызове ф-ии
status := SI_Open(DeviceNum, @uHandle);
результат открытия - SI_SUCCESS.
Проблема теперь со сбросом буфера:
status := SI_FlushBuffers(uHandle, 1, 1);
ответ - SI_INVALID_HANDLE.
Как быть с этой проблемой?
После замены описания в файле SiUSBXp на
function SI_Open(
DeviceNum: DWORD;
Handle: pointer
): SI_STATUS; stdcall; external 'SiUSBXp.dll';
(Thandle заменен на pointer)
и вызове ф-ии
status := SI_Open(DeviceNum, @uHandle);
результат открытия - SI_SUCCESS.
Проблема теперь со сбросом буфера:
status := SI_FlushBuffers(uHandle, 1, 1);
ответ - SI_INVALID_HANDLE.
Как быть с этой проблемой?
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
Дело в том, что некоторым библиотечным функциям нужно передавать не саму переменную, а указатель на нее. Если это не сделать, то функция SI_Open возвращает SI_Invalid_Parameter.
По ссылке лежит архив с драйверами и библиотеками на С++ для ЛИР-917. В папке LIB\VC6 лежит заголовочный файл с комментариями по русски. Они описывают параметры, которые должны быть указаны функции. Эти же параметры нужно указать и в Delphi. Версия 7 переводит переменную в указатель автоматически. В других версиях нужно ставить указатель вручную.
[/url]
По ссылке лежит архив с драйверами и библиотеками на С++ для ЛИР-917. В папке LIB\VC6 лежит заголовочный файл с комментариями по русски. Они описывают параметры, которые должны быть указаны функции. Эти же параметры нужно указать и в Delphi. Версия 7 переводит переменную в указатель автоматически. В других версиях нужно ставить указатель вручную.
[/url]
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
Здравствуйте, Stas.
Мы поставили у себя Delphi5 и написали под ней рабочий пример. Файл лежит по этой ссылке. Похоже, был конфликт между типами данных в разных версиях Delphi.
Мы поставили у себя Delphi5 и написали под ней рабочий пример. Файл лежит по этой ссылке. Похоже, был конфликт между типами данных в разных версиях Delphi.
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
Благодарю за оперативную помощь!
Демонстрационный проект скачал, компилируется и запускается, естественно, без ошибок.
Возник такой вопрос: подключаю ЛИР-917 (без датчика), запускаю программу. Результат - 0 - 2 - 0 - 0. Форма честно реагирует на нажатия клавиш обнуления (две справа).
Закрываю программу, запускаю снова - сначала небольшая пауза, чуть менее секунды, затем - вместо чисел появляются надписи "Panel", а потом - 256-1926832896-372-51. Закрываю программу, запускаю снова - те же числа. На обнуление реакции нет. Форма как будто зависла. Помогает только отключение/включение ЛИР-917.
Примерно то же у меня получается и с программой, идущей в комплекте.
Первый раз после подключения - все нормально, в средней строке - ноль. А при выключении/включении программы вместо нуля появляется 587202560. И перезапуск программы не помогает.
В чем может быть дело?
Демонстрационный проект скачал, компилируется и запускается, естественно, без ошибок.
Возник такой вопрос: подключаю ЛИР-917 (без датчика), запускаю программу. Результат - 0 - 2 - 0 - 0. Форма честно реагирует на нажатия клавиш обнуления (две справа).
Закрываю программу, запускаю снова - сначала небольшая пауза, чуть менее секунды, затем - вместо чисел появляются надписи "Panel", а потом - 256-1926832896-372-51. Закрываю программу, запускаю снова - те же числа. На обнуление реакции нет. Форма как будто зависла. Помогает только отключение/включение ЛИР-917.
Примерно то же у меня получается и с программой, идущей в комплекте.
Первый раз после подключения - все нормально, в средней строке - ноль. А при выключении/включении программы вместо нуля появляется 587202560. И перезапуск программы не помогает.
В чем может быть дело?
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
Stas, а в программе с диска кнопка обнуления работает если выскакивает число?
По поводу программы под Delphi5 запретите работу таймера в ObjectInspector (Timet1=False). После функции SI_CHECHRXQUEUE Timer1.Enabled:=True;
Еще похоже на то, что вылетает драйвер ЛИР917. Можно попробовать переустановить его с архива, который Вы скачивали вчера с исходниками на C. "архив с драйверами и библиотекой на С++".
По поводу программы под Delphi5 запретите работу таймера в ObjectInspector (Timet1=False). После функции SI_CHECHRXQUEUE Timer1.Enabled:=True;
Еще похоже на то, что вылетает драйвер ЛИР917. Можно попробовать переустановить его с архива, который Вы скачивали вчера с исходниками на C. "архив с драйверами и библиотекой на С++".
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52
-
- СКБИС
- Сообщения: 272
- Зарегистрирован: 07 фев 2008, 09:52