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 編輯 ]