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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Непонятно, что происходит с переменными??? 
:(
    Опции темы
wanderervb
Дата 6.4.2008, 03:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Помогите пожалуйста, уже неделю мучаюсь, все проверил, и все перепробовал но не добился никакого результата.
Пишу программку, точнее, написал для настройки серийного номера устройства, а также индификационных номеров PID, VID, устройства CP2102. Было несколько вопросов, но нашлись добрые люди, которые помогли. 
Настройка серийного номера устройства
И как всегда, когда кажется, что вот уже свершилось, - наступаешь на «грабли»
При настройки индификатора PID, прописывается непонятно взятое значение.
Производитель пишет, что индификатор изделия 2-а байта.
При помощи функции 
Код

Status = CP210x_GetDevicePid(hUSBDevice, Pid)

Получил требуемый номер, и переменной Pid было присвоено значение 33732
При помощи Hex( ) преобразовал в 16-й код  Hex(Pid) получилось значение 83С4
При помощи функции
Код

Status = CP210x_SetPid(hUSBDevice, Pid2)

Попробовал записать тоже самое значение (для проверки правильности кода)
Присвоил переменной Pid2 = 33732 но почему-то прописывается значение 41364 (A194)
Я пробовал по-разному присваивать требуемую величину:
Код

Pid2 = 33732
Pid2 = &H83C4&

Пробовал преобразовывать ASCII-код символа при помощи функции Asc, - безрезультатно

Код

Public Function ConvertToPid(ConvertPidArray As String, ConvertLengthPid As Long) As Byte

    Dim i
    For i = 1 To ConvertLengthPid
        ConvertPid(i - 1) = Asc(Mid(ConvertPidArray, i, ConvertLengthPid))
    Next
End Function

Подскажите, как правильно присвоить переменной Pid2 значение 83C4

Заранее благодарю

Добавлено через 4 минуты и 40 секунд
Приношу свои извинения, - случайно продублировал
PM MAIL   Вверх
wanderervb
Дата 6.4.2008, 18:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Если это поможет, вот часть кода:


В отдельном модуле (CP210x_Main) объявил функции:

Код

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

Public Declare Function CP210x_GetDeviceVid Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, ByRef wVid As Long) As Integer
Public Declare Function CP210x_GetDevicePid Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, ByRef wPid As Long) As Integer
Public Declare Function CP210x_GetDeviceSerialNumber Lib "CP210xManufacturing.dll" (ByVal cyHandle As Long, ByRef lpSerialNumber As Byte, ByRef bLength As Long, bConvertToUnicode As Boolean) As Integer
В этом же модуле на основании даташита объявил константы:

Код

Public Const CP210x_RETURN_SERIAL_NUMBER = &H0
Public Const CP210x_RETURN_DESCRIPTION = &H1
Public Const CP210x_RETURN_FULL_PATH = &H2

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

'Максимальная длинна строки
Public Const CP210x_MAX_DEVICE_STRLEN = 256
Public Const CP210x_MAX_PRODUCT_STRLEN = 126
Public Const CP210x_MAX_SERIAL_STRLEN = 63
Public Const CP210x_MAX_MAXPOWER = 250
Public Const CP210x_MAX_PID = 4

Public Const INVALID_HANDLE_VALUE = &H1 

В другом модуле ( modMain ) определил переменные:

Код

Global devNum As Long    
Global hUSBDevice As Long 
Global hUSBDevice2 As Long
Global Status As Integer 
Global SpeedDevice As Long
Global SpeedLock As Long
Global DeviceNum As Long
Global DeviceString(CP210x_MAX_PRODUCT_STRLEN) As Byte
'Global DeviceOption As Long


Global SerialLength2 As Long
Global SerialLingthProduct As Long
Global SerialString(CP210x_MAX_SERIAL_STRLEN) As Byte
Global ConvertArray2(CP210x_MAX_SERIAL_STRLEN) As Byte
Global ConvertProduct2(CP210x_MAX_PRODUCT_STRLEN) As Byte
Global ConvertPid(CP210x_MAX_PID) As Byte
Global NewSerialNumber As String
Global NewSerialProduct As String
Global NewPid As Long
Global Pid2 As Long
Global CodTex As Variant

В форме ( FormMain ) код для получения всей информации от устройства:

Код

Public Sub GetDeviceData()


    Dim CR As String
    CR = Chr(13) + Chr(10)
    
    
    Dim Vid As Long
    Dim Pid As Long
    
    Dim SerialLength As Long
    Dim DeviceOption As Long
    DeviceNum = 0
    SerialLength = 0
    DeviceOption = 0
    
    Dim TempString As String
    TempString = ""
    Dim i
    
    For i = 0 To devNum - 1
        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_GetDeviceProductString(hUSBDevice, DeviceString(0), DeviceOption, True)
                    If Status = CP210x_SUCCESS Then
                        Status = CP210x_GetDeviceSerialNumber(hUSBDevice, SerialString(0), SerialLength, True)
                        If Status = CP210x_SUCCESS Then
                            Status = CP210x_Close(hUSBDevice)
                            TempString = TempString + "Found Device: VID=" + Hex(Vid) + ", PID=" + Hex(Pid) + CR
                            TempString = TempString + "Serial Num=  " + ConvertToString(SerialString(), SerialLength) + CR
                            TempString = TempString + "Product String=  " + ConvertToProduct(DeviceString(), DeviceOption) + CR
                            Text2.Text = Hex(Vid)
                            Text3.Text = Hex(Pid)
                            Text1.Text = ConvertToString(SerialString(), SerialLength)
                            End If
                          Status = CP210x_Close(hUSBDevice)
                        End If
                        Status = CP210x_Close(hUSBDevice)
                End If
                Status = CP210x_Close(hUSBDevice)
            End If
            Status = CP210x_Close(hUSBDevice)
        End If
        Status = CP210x_Close(hUSBDevice)
        
        Dim Port As Integer
        Dim WinVersion As Long

    Next
    
    DataText.Text = TempString + CR + CR
    
    i = 0
    For i = 0 To SerialLength - 1
        SerialString(i) = 0
    Next
    
    i = 0
    For i = 0 To DeviceOption - 1
        DeviceString(i) = 0
    Next
    
    
End Sub

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


В форме ( FormMain ) код для настройки требуемых параметров:

Код

Private Sub SetDeviceSeria()

    Dim CheckPro As String
    Dim SerialString2(CP210x_MAX_SERIAL_STRLEN) As Byte  
    Dim SerialProduct2(CP210x_MAX_PRODUCT_STRLEN) As Byte
    Dim PidLength As Long
    Dim ind As String
    Dim SerialByte As Long
    Dim NewPidDevice As String
    
        
    

    CheckPro = 0
    CodTex = Chr$(127)
    Text6.Text = ""

    NewSerialProduct = Text8.Text
    NewSerialNumber = Text4.Text
    NewPidDevice = Text3.Text

    hUSBDevice = INVALID_HANDLE_VALUE
   
     SerialLength2 = Len(NewSerialNumber)
    SerialLingthProduct = Len(NewSerialProduct)
    PidLength = Len(NewPidDevice)
   
    Pid2 = &H83C4&
    Pid2 = 33732    

    Call ConvertToPid(NewPidDevice, PidLength)
    Call ConvertToByte(NewSerialNumber, SerialLength2) 
     Call ConvertToNewProduct(NewSerialProduct, SerialLingthProduct) 'SerialProduct2(0)
    ind = 0
    

Status = CP210x_Open(ind, hUSBDevice)
        If Status = CP210x_SUCCESS Then
           Status = CP210x_SetSerialNumber(hUSBDevice, ConvertArray2(0), SerialLength2, True)
                   If Status = CP210x_SUCCESS Then
                   Status = CP210x_SetProductString(hUSBDevice, ConvertProduct2(0), SerialLingthProduct, True)
                    If Status = CP210x_SUCCESS Then
                        Status = CP210x_SetPid(hUSBDevice, Pid2)
                            If Status = CP210x_SUCCESS Then
                                Status = CP210x_Reset(hUSBDevice)
                                   CheckPro = CheckPro + 1
                                    If Status = CP210x_SUCCESS Then
                                     Status = CP210x_Close(hUSBDevice)
                                    End If
                                'CP210x_Close (hUSBDevice)
                            'End If
                        Status = CP210x_Close(hUSBDevice)
                     End If
                    Status = CP210x_Close(hUSBDevice)
                End If
                Status = CP210x_Close(hUSBDevice)
            End If
            
    If Not CheckPro = 0 Then
        Text7.Text = "SUCCESS"
        Text7.BackColor = (&HFF00&)
        GoTo EndCheck
    End If
        Text7.Text = "ERROR"
        Text7.BackColor = (&HFF&)
EndCheck:
        Call GetDeviceData
                
End Sub



Public Function ConvertToNewProduct(ConvertStringProductArray As String, ConvertLengthStringProduct As Long) As Byte

    Dim i
    For i = 1 To ConvertLengthStringProduct
        ConvertProduct2(i - 1) = Asc(Mid(ConvertStringProductArray, i, ConvertLengthStringProduct))
    Next
End Function
Public Function ConvertToPid(ConvertPidArray As String, ConvertLengthPid As Long) As Byte

    Dim i
    For i = 1 To ConvertLengthPid
        ConvertPid(i - 1) = Asc(Mid(ConvertPidArray, i, ConvertLengthPid))
    Next
End Function

Public Function ConvertToByte(ConvertString2 As String, ConvertLength2 As Long) As Byte


    Dim CheckString As String
    
    
    Dim i
    
    For i = 1 To ConvertLength2
        ConvertArray2(i - 1) = Asc(Mid(ConvertString2, i, ConvertLength2))
    Next
    
    
     
End Function

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


Новичок



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

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



Неужели ни кто не сможет помочь?
Хотя бы намекните, в каком направлении «копать» 
Из-за того, что сейчас у меня происходит с программой, мне кажется, что я что-то не то сделал с модулями, а вот что… - ни как не могу понять.
Добавив в модуль переменную, у меня почему-то теперь и сериальный номер устройства стал записываться наполовину требуемого значения.
Какая связь?



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


Инженер
****


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

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



Код

Pid2 = 33732

это срабатывает правильно?


Чему равна переменная сруз после этой
Код

Pid2 = 41364

строки?


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

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


Новичок



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

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



Цитата(cardinal @ 10.4.2008,  07:12)



Чему равна переменная сруз после этой
Код

Pid2 = 41364


Присвоил переменной значение Pid2 = 41364
После выполнения функции настройки PID

Код

                        Status = CP210x_SetPid(hUSBDevice, Pid2)

Значение переменной Pid2 не изменилось, сообщений с устройства об ошибках, - не было
После выполнения функции по перезагрузки устройства
 
Код

Status = CP210x_Reset(hUSBDevice)


Устройство перезагрузилось, сообщений об ошибках не было.
Проверка значения PID показало, что PID = AD98

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

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

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

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

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


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

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


 




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


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

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