發新話題
打印

CP2102使用上問題

CP2102使用上問題

您好.目前使用VB6搭配CP2102跟MCU做通訊上碰到點問題.以下CODE是我用Silicon lab
範例程式 AN197SW 加上comport 和timer做一1ms固定丟一個byte的動作,但卻發現丟出
來的byte間隔卻是15ms左右,更奇怪的是我將這程式放到筆電上執行,執行出來的傳輸間隔
又不太一樣,目前我是用我認為最單純的code做測試,沒連接MCU且VB CODE也是原廠的範例
不是我目前自己寫的VB介面,請問這是為什麼呢? 是VB程式運作和電腦其他程式的互搶問題嗎?
還是CP2102本身傳輸反應問題嗎?  >< ....

Option Explicit
Dim port As Integer
Dim usb_ok_fg As Boolean



Private Sub cmdQuit_Click()

    End
   
End Sub

Private Sub cmdRefresh_Click()

    FillDeviceList
   
End Sub

Private Sub Form_Load()

    hUSBDevice = INVALID_HANDLE_VALUE
    Call FillDeviceList
   
    Timer1.Enabled = False
    Timer1.Interval = 1
    Timer1.Enabled = True
   
    If (MSComm1.PortOpen = True) Then MSComm1.PortOpen = False
    MSComm1.CommPort = port
    MSComm1.Settings = "57600,N,8,1"
    MSComm1.InputLen = 0
    'MSComm1.InBufferSize =
    MSComm1.RThreshold = 1
    MSComm1.SThreshold = 1
    MSComm1.InputMode = 1
    If (MSComm1.PortOpen = False) Then MSComm1.PortOpen = True
  
    usb_ok_fg = True

End Sub

Public Sub FillDeviceList()

    Call EnumDevices
    Call GetDeviceData
   
End Sub

Public Sub EnumDevices()

    Status = CP210x_GetNumDevices(devNum)
   
End Sub

Public Sub GetDeviceData()

    'Variable for carriage returns
    Dim CR As String
    CR = Chr(13) + Chr(10)
   
    'Variables for the Vid, Pid and Serial Number (SN is a String of chars of length SerialLength)
    Dim Vid As Long
    Dim Pid As Long
    Dim SerialString(CP210x_MAX_SERIAL_STRLEN) As Byte
    Dim SerialLength As Long
        
    'String to hold all our current data to display
    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_GetDeviceSerialNumber(hUSBDevice, SerialString(0), SerialLength, True)
                    If Status = CP210x_SUCCESS Then
                        CP210x_Close (hUSBDevice)
                        TempString = TempString + "Found Device: VID=" + Hex(Vid) + ", PID=" + Hex(Pid) + CR
                        TempString = TempString + "           Serial Num=" + ConvertToString(SerialString(), SerialLength) + CR
                    End If
                    CP210x_Close (hUSBDevice)
                End If
                CP210x_Close (hUSBDevice)
            End If
            CP210x_Close (hUSBDevice)
        End If
        
        'Dim port As Integer
        Dim WinVersion As Long
        WinVersion = GetVersion() And VERSION_MASK
        If WinVersion = VERSION_WINXP2000 Or WinVersion = VERSION_WINVISTA Then
            port = GetPortNumXP2000Vista(Vid, Pid, SerialString(), SerialLength)
        ElseIf WinVersion = VERSION_WIN98 Then
            port = GetPortNum98(Vid, Pid, SerialString(), SerialLength)
        End If
        
        TempString = TempString + "This device is on COM Port: " + Str(port) + CR + CR
         
        CP210x_Close (hUSBDevice)
    Next
   
    txtData = TempString + CR + CR
   
End Sub

Private Sub Form_Unload(Cancel As Integer)

    CP210x_Close (hUSBDevice)
   
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


Public Function GetPortNumXP2000Vista(Vid As Long, Pid As Long, SerialString() As Byte, SerialLength As Long) As Integer

        Dim HKLMKey As Long
        Dim EnumKey As Long
        Dim VidPidKey As Long
        Dim PortKey As Long
        Dim Length As Long
        Dim Valtype As Long
        Dim TmpStr(101) As Byte
        Length = 100
        Dim PortNum As Integer
        Dim VidPidString As String
               
        PortNum = -1
        
        Dim i
        
        If ERROR_SUCCESS = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\CurrentControlSet\", 0, KEY_READ, HKLMKey) Then
            If ERROR_SUCCESS = RegOpenKey(HKLMKey, "Enum\USB\", EnumKey) Then
                For i = 0 To SerialLength
                    If SerialString(i) = 32 Then
                        SerialString(i) = 95
                    End If
                Next
                VidPidString = "Vid_" + Right("0000" & LCase(Hex(Vid)), 4) + "&Pid_" + Right("0000" & LCase(Hex(Pid)), 4) + "&Mi_00\" + ConvertToString(SerialString(), SerialLength) + "_00"
                If ERROR_SUCCESS = RegOpenKey(EnumKey, VidPidString, VidPidKey) Then
                    If ERROR_SUCCESS = RegOpenKey(VidPidKey, "Device Parameters", PortKey) Then
                        If ERROR_SUCCESS = RegQueryValueEx(PortKey, "PortName", 0, Valtype, TmpStr(0), Length) Then
                            TmpStr(0) = 48
                            TmpStr(1) = 48
                            TmpStr(2) = 48
                            PortNum = Val(ConvertToString(TmpStr(), Length - 1))
                        End If
                        RegCloseKey (PortKey)
                    End If
                    RegCloseKey (VidPidKey)
                Else
                    VidPidString = "Vid_" + Right("0000" & LCase(Hex(Vid)), 4) + "&Pid_" + Right("0000" & LCase(Hex(Pid)), 4) + "\" + ConvertToString(SerialString(), SerialLength)
                    If ERROR_SUCCESS = RegOpenKey(EnumKey, VidPidString, VidPidKey) Then
                        If ERROR_SUCCESS = RegOpenKey(VidPidKey, "Device Parameters", PortKey) Then
                            If ERROR_SUCCESS = RegQueryValueEx(PortKey, "PortName", 0, Valtype, TmpStr(0), Length) Then
                                TmpStr(0) = 48
                                TmpStr(1) = 48
                                TmpStr(2) = 48
                                PortNum = Val(ConvertToString(TmpStr(), Length - 1))
                            End If
                            RegCloseKey (PortKey)
                        End If
                        RegCloseKey (VidPidKey)
                    End If
                End If
                RegCloseKey (EnumKey)
            End If
            RegCloseKey (HKLMKey)
        End If
        RegCloseKey (HKEY_LOCAL_MACHINE)
        
        GetPortNumXP2000Vista = PortNum
        
End Function


Public Function GetPortNum98(Vid As Long, Pid As Long, SerialString() As Byte, SerialLength As Long) As Integer

    Dim PortKey As Long
    Dim Length As Long
    Dim Valtype As Long
    Dim TmpStr(101) As Byte
    Length = 100
    Dim PortNum As Integer
    Dim VidPidString As String
    Dim SerialIndex As Integer
    Dim SerialKeyString As String
    Dim Status As Long
           
    PortNum = -1
   
    SerialIndex = 0
    SerialKeyString = "Enum\SLABCR\guid\000" + Trim(Str(SerialIndex))
   
    Dim i
   
    For i = 0 To SerialLength
        If SerialString(i) = 32 Then
            SerialString(i) = 95
        ElseIf ((SerialString(i) >= &H61) And (SerialString(i) <= &H7A)) Then
            SerialString(i) = SerialString(i) - 32
        End If
    Next
   
    VidPidString = "USB\VID_" + UCase(Hex(Vid)) + "&PID_" + UCase(Hex(Pid)) + "&MI_00\" + ConvertToString(SerialString, SerialLength) + "_00"
   
    Do While ERROR_SUCCESS = RegOpenKey(HKEY_LOCAL_MACHINE, SerialKeyString, PortKey)
        Status = RegQueryValueEx(PortKey, "CRLowerDeviceID", 0, Valtype, TmpStr(0), Length)
        If Status = ERROR_MORE_DATA Then
            SerialIndex = SerialIndex - 1
        ElseIf Status = ERROR_SUCCESS Then
            If VidPidString = ConvertToString(TmpStr(), Length - 1) Then
                If ERROR_SUCCESS = RegQueryValueEx(PortKey, "PortName", 0, Valtype, TmpStr(0), Length) Then
                    TmpStr(0) = 48
                    TmpStr(1) = 48
                    TmpStr(2) = 48
                    PortNum = Val(ConvertToString(TmpStr(), Length - 1))
                End If
            End If
        End If
        
        SerialIndex = SerialIndex + 1
        SerialKeyString = "Enum\SLABCR\guid\000" + Trim(Str(SerialIndex))
        
        RegCloseKey (PortKey)
    Loop
    RegCloseKey (HKEY_LOCAL_MACHINE)
        
    GetPortNum98 = PortNum

End Function

Private Sub Timer1_Timer()
  Dim byte_array(0) As Byte
  byte_array(0) = 90   ' handshake code
  MSComm1.InBufferCount = 0
  If (usb_ok_fg = True) Then MSComm1.Output = byte_array()
End Sub

[ 本帖最後由 1984cf 於 2011-9-19 09:43 編輯 ]

TOP

發新話題