Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > VB6 > Непонятно, что происходит с переменными???


Автор: wanderervb 6.4.2008, 03:14
Помогите пожалуйста, уже неделю мучаюсь, все проверил, и все перепробовал но не добился никакого результата.
Пишу программку, точнее, написал для настройки серийного номера устройства, а также индификационных номеров PID, VID, устройства CP2102. Было несколько вопросов, но нашлись добрые люди, которые помогли. 
http://forum.vingrad.ru/forum/topic-202732.html
И как всегда, когда кажется, что вот уже свершилось, - наступаешь на «грабли»
При настройки индификатора 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 секунд
Приношу свои извинения, - случайно продублировал

Автор: wanderervb 6.4.2008, 18:04
Если это поможет, вот часть кода:


В отдельном модуле (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

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



Автор: cardinal 10.4.2008, 07:12
Код

Pid2 = 33732

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


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

Pid2 = 41364

строки?

Автор: wanderervb 11.4.2008, 02:59
Цитата(cardinal @ 10.4.2008,  07:12)



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

Pid2 = 41364


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

Код

                        Status = CP210x_SetPid(hUSBDevice, Pid2)

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

Status = CP210x_Reset(hUSBDevice)


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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)