Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите пожалуйста! Как работать с функцией DLL? 
:(
    Опции темы
wanderervb
Дата 26.3.2008, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Доброе время суток! 
Помогите пожалуйста, совсем замаялся с функцией настройки серийного номера USB конвертора. 
Необходима программка считывающая и меняющая серийный номер конвертера CP2102 
Со считыванием номера нет никаких проблем, а вот поменять на другой ни как не получается. 
Все делаю по инструкции: 
Описал функцию в отдельном модуле: 

Код

Public Declare Function CP210x_SetSerialNumber Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, ByRef lpSerialNumber As Byte, bLength As Long) As Integer 

Определил константы: 
Код

Public Const CP210x_SUCCESS = &H0 
Public Const CP210x_DEVICE_NOT_FOUND = &HFF 
Public Const CP210x_INVALID_HANDLE = &H1 
Public Const CP210x_INVALID_PARAMETER = &H2 
Public Const CP210x_DEVICE_IO_FAILED = &H3 

Программа определила количество подключенных устройств 
Код

Status = CP210x_GetNumDevices(devNum) 

Получил номер устройства 
Код

Status = CP210x_Open(i, hUSBDevice) 

Получил серийный номер 
Код

Status = CP210x_GetDeviceSerialNumber(hUSBDevice, SerialString(0), SerialLength, True) 

А когда пытаюсь записать новый серийный номер, VB выдает сообщение, что неправильный номер аргумента или неверное назначение. 

Может кто писал приложения для CP210x, помогите, в чем может быть проблема? 

У производителя скачал даташит AN144

Это сообщение отредактировал(а) cardinal - 26.3.2008, 16:40
PM MAIL   Вверх
cardinal
Дата 26.3.2008, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Модератор: wanderervb, пользуйтесь тегом "код"! 


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
wanderervb
Дата 26.3.2008, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Спасибо, непременно
PM MAIL   Вверх
cardinal
Дата 26.3.2008, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



У FTDI например есть своя программа для того, чтобы это сделать. Может есть такая же программа для изменения серийного номера и у CP210x? Если с помощью программы тоже не получится изменить этот номер, то может стоит защита и с твоим устройством это вообще невозможно (а возможно только со своим чипом).


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
wanderervb
Дата 27.3.2008, 05:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Цитата(cardinal @ 26.3.2008,  18:26)
У FTDI например есть своя программа для того, чтобы это сделать. Может есть такая же программа для изменения серийного номера и у CP210x? Если с помощью программы тоже не получится изменить этот номер, то может стоит защита и с твоим устройством это вообще невозможно (а возможно только со своим чипом).

У CP210x тоже есть такая программа, при помощи которой можно изменить серийный номер, но она не удобная для постоянного использования, вот и затеял написать программку позволяющую процесс изменения серийного номера упростить. 
Ссылка на даташит:


Вот часть кода:

Максимальная длинна строки

Код

Public Const CP210x_MAX_SERIAL_STRLEN = 63


В процедуре чтения:
Код

Dim SerialString(CP210x_MAX_SERIAL_STRLEN) As Byte
Dim SerialLength As Long

Status = CP210x_Open(i, hUSBDevice)
 If Status = CP210x_SUCCESS Then
    Status = CP210x_GetDeviceVid(hUSBDevice, Vid)
      If Status = CP210x_SUCCESS Then
       Status = CP210x_GetDevicePid(hUSBDevice, Pid)
         If Status = CP210x_SUCCESS Then
         Status = CP210x_GetDeviceSerialNumber(hUSBDevice, SerialString(0), SerialLength, True)
                    If Status = CP210x_SUCCESS Then

                        Text5.Text = ConvertToString(SerialString(), SerialLength)

                    End If
                    CP210x_Close (hUSBDevice)
                End If
                CP210x_Close (hUSBDevice)
            End If
            CP210x_Close (hUSBDevice)
        End If

В функции:
Код

Public Function ConvertToString(ConvertArray() As Byte, ConvertLength As Long) As String

    Dim ConvertString As String
    ConvertString = ""
    
    Dim i
    
    For i = 0 To ConvertLength - 1
        ConvertString = ConvertString + Chr(ConvertArray(i))
    Next
    
    ConvertToString = ConvertString
    
End Function


В процедуре записи:
Код

Private Sub SetDeviceSeria()
    Dim SerialString2(CP210x_MAX_SERIAL_STRLEN) As Byte  '(CP210x_MAX_SERIAL_STRLEN)
    Dim ind As String
    Dim SerialByte As Long
    SerialByte = 36
    ind = 1
    SerialString2(36) = "NT-FTLGController0000000000000000002"     
    

Status = CP210x_Open(ind, hUSBDevice)
        If Status = CP210x_SUCCESS Then
                Status = CP210x_SetSerialNumber(hUSBDevice, SerialString2(0), SerialByte, True)
                    If Status = CP210x_SUCCESS Then


PM MAIL   Вверх
Akina
Дата 27.3.2008, 09:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(wanderervb @  26.3.2008,  16:20 Найти цитируемый пост)
когда пытаюсь записать новый серийный номер, VB выдает сообщение, что неправильный номер аргумента или неверное назначение. 

Смотрим дефиницию, видим три аргумента.
Смотрим вызов, видим 4 аргумента.
Понимаем, что чего-то не понимаем.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 27.3.2008, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(Akina @  27.3.2008,  08:40 Найти цитируемый пост)
Смотрим дефиницию, видим три аргумента.
Смотрим вызов, видим 4 аргумента.

Про три я ничего не нашел в документе, тут ИМХО все правильно.

Я вот больше думаю правильно ли то, что ты говоришь, что ind = 1? То есть что ты обращаешься ко второму device!
Цитата

DeviceNum—Device index. 0 for the first device, 1 for the second, etc.



--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
Akina
Дата 27.3.2008, 14:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(cardinal @  27.3.2008,  15:02 Найти цитируемый пост)
Про три я ничего не нашел в документе, тут ИМХО все правильно

Я вижу дефиницию, котрая написана в самом первом посте. С какого конца не считай - аргументов три.
И вижу вызов в том же посте. Там аргументов - четыре, тоже вне зависимости от направления подсчета.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
wanderervb
Дата 27.3.2008, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



[QUOTE=cardinal,27.3.2008,  14:02]
Цитата(Akina @  27.3.2008,  08:40 Найти цитируемый пост)

Я вот больше думаю правильно ли то, что ты говоришь, что ind = 1? То есть что ты обращаешься ко второму device!
Цитата

DeviceNum—Device index. 0 for the first device, 1 for the second, etc.

Приношу свои извинения, - это опечатка

Код

ind = 0


Обращение к нулевому устройству


При записи серийного номера ind = 0
 
У меня затруднения с переменной SerialString2( ), хотя точно не уверен.

При получении серийного номера от устройства
SerialString() определена как байт
Все взято из даташита

Код

Public Const CP210x_MAX_SERIAL_STRLEN = 63
    Dim SerialString(CP210x_MAX_SERIAL_STRLEN) As Byte
    Dim SerialLength As Long


Функция, извлекающая номер из устройства 
Код

Status = CP210x_GetDeviceSerialNumber(hUSBDevice, SerialString(0), SerialLength, True)

Получает первый байт серийного номера SerialString(0) и длинну номера SerialLength
Хотя в даташите написано, что SerialStrin() должен получить строку
Ну да ладно, - перебрав побайтно SerialStrin() , я получил действительно номер устройства.
Хотя для меня непонятно, - почему в функции необходимо указывать SerialString(0)

По аналогии получения номера от устройства, попытался записать свой номер.
Так как функция получения номера дает байт от номера, а не всю строку, я так же для записи попробовал записать первый байт серийного номера, но все безуспешно.
При записи байта, я получаю ошибку проверки Status

Код

CP210x_INVALID_PARAMETER


В случае записи всей строки получаю сообщение, что аргумент не соответствует описанию или Type mismatch 
Я попробовал и менять тип переменной, и длину серийного номера.
Ничего не помогает.

PM MAIL   Вверх
wanderervb
Дата 27.3.2008, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Цитата(Akina @ 27.3.2008,  09:40)
Смотрим дефиницию, видим три аргумента.
Смотрим вызов, видим 4 аргумента.
Понимаем, что чего-то не понимаем.

Спасибо 

Исправлено

Код

Public Declare Function CP210x_SetSerialNumber Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, ByRef lpSerialNumber As Byte, bLength As Long, bConvertToUnicode As Boolean) As Integer


Но проблема осталась.

PM MAIL   Вверх
Akina
Дата 27.3.2008, 18:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 34
Всего: 454



Цитата(wanderervb @  27.3.2008,  18:55 Найти цитируемый пост)
Получает первый байт серийного номера SerialString(0) и длинну номера SerialLength
Хотя в даташите написано, что SerialStrin() должен получить строку

Все правильно написано. Хоть в SerialString() передается строка, но оно у тебя определено как массив байтов. Собственно для того и существует процедура ConvertToString(), чтобы массив байтов превратить в строку. Хотите работать со строковой переменной - передавайте в функцию VARPTR на строку требуемой длины.

Но должна существовать и комплементарная процедура, которая превратит строку сериального номера для присвоения в массив байтов, который можно скормить функции CP210x_SetSerialNumber
Код

Public Sub ConvertFromString(ConvertArray() As Byte, ConvertString As String)
    Dim i As Integer
' не убежден, но, возможно, нужна зачистка
'    For i = 0 To CP210x_MAX_SERIAL_STRLEN
'        ConvertArray(i) = 0
'    Next i
    For i = 1 To Len(ConvertString)
        ConvertArray(i-1) = ASC(Mid(ConvertString, i))
    Next i
End Sub 

Более того, мне напрочь неясно, как может работать этот код:
Код

Private Sub SetDeviceSeria()
    Dim SerialString2(CP210x_MAX_SERIAL_STRLEN) As Byte
' skipped
    SerialString2(36) = "NT-FTLGController0000000000000000002"  

На операторе присвоения он должен визжать как недорезанный поросенок, что не может присвоить значение массиву. Или по крайней мере жаловаться на несоответствие типов.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
cardinal
Дата 27.3.2008, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(Akina @  27.3.2008,  13:10 Найти цитируемый пост)
Я вижу дефиницию, котрая написана в самом первом посте. С какого конца не считай - аргументов три.

Туда не смотрел smile Смотрел сразу в Datasheet...


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
wanderervb
Дата 1.4.2008, 04:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Спасибо Всем, заработало

Только есть небольшие затруднения с настройкой PID
При записи PID его значение меняется на произвольную величину, при этом устройство не выдает сообщений об ошибках

Код

Public Declare Function CP210x_SetPid Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, wPid As Long) As Integer

Global PID2 As Long

PID2 = 33732

Status = CP210x_SetPid(hUSBDevice, PID2)


И еще одна неприятная вещ, устройство не всегда перенастраивается.
Ни как не могу понять причины.
Не меняя программы, а только перезагрузив ее, устройство "смерено" меняет серийные номера (кроме PID) и другие настройки. При новом подключении начинает на каждую команду настройки, отправлять сообщение, о неверном параметре и не хочет менять настроек.
Какую-то зависимость такого поведения выявить не удалось.
Все уже перепроверил, в одном случае меняет настройки, в другом, нет.
В даташите о таких ситуациях ничего не написано.
Так как это происходит со всеми устройствами, грешу только на программу, а что в ней еще проверить, - не приложу ума 

PM MAIL   Вверх
cardinal
Дата 1.4.2008, 12:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Инженер
****


Профиль
Группа: Экс. модератор
Сообщений: 6003
Регистрация: 26.3.2002
Где: Германия

Репутация: 19
Всего: 99



Цитата(wanderervb @  1.4.2008,  03:12 Найти цитируемый пост)
При новом подключении начинает на каждую команду настройки, отправлять сообщение, о неверном параметре и не хочет менять настроек.

cyHandle поменялся?


--------------------
Немецкая оппозиция потребовала упростить натурализацию иммигрантов
В моем блоге: Разные истории из жизни в Германии

"Познание бесконечности требует бесконечного времени, а потому работай не работай - все едино".  А. и Б. Стругацкие
PM   Вверх
wanderervb
Дата 1.4.2008, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 14
Регистрация: 26.3.2008

Репутация: нет
Всего: нет



Цитата(cardinal @ 1.4.2008,  12:07)
Цитата(wanderervb @  1.4.2008,  03:12 Найти цитируемый пост)
При новом подключении начинает на каждую команду настройки, отправлять сообщение, о неверном параметре и не хочет менять настроек.

cyHandle поменялся?

Нет, не поменялся
В начале процедуры настройки S/N, PID и т.д. , я получаю новый cyHandle

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "VB6"
Akina

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по VB обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • Используйте теги [code=vb][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | VB6 | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.