对于vb中mscomm的一点总结
a.首先对于MSComm1_OnComm()事件只有设置了RThreshold后才能执行,否则不执行!
在 MSComm 控件设置 CommEvent 属性为 comEvReceive 并产生 OnComm 之前,设置并返回的要接收的字符数。
语法 object.Rthreshold [ = value ]
Rthreshold 属性语法包括下列部分:
部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明在产生 OnComm 事件之前要接收的字符数。
当接收字符后,若 Rthreshold 属性设置为 0(缺省值)则不产生 OnComm 事件。
例如,设置 Rthreshold 为 1,接收缓冲区收到每一个字符都会使 MSComm 控件产生 OnComm 事件。
对于.Rthreshold 如果设置太大或太小都会影响接收数据正确性,所以我一般采用timer事件进行数据接收(在这种情况下不用设置Rthreshold),并且可以读取正确的数据!
1.读取扫描枪的数据 (来源互联网)
Private Sub Form_Load()
With MSComm1
.CommPort = 3 '设为COM3,试运行的系统而定,你可提供一个Combox让用户选择。
.PortOpen = True '打开通讯端口
End With
End Sub
Private Sub MSComm1_OnComm()
Dim EndPos As Integer
Select Case MSComm1.CommEvent
Case comEvReceive '当有数据传送过来时
sData = sData & Trim(MSComm1.Input)
'检索回车,通常读卡机每组数据結尾都返回一个回车作为结束符
EndPos = InStr(1, sData, Chr(13))
If EndPos = 0 Then '如果未结束就继续努力
Else '读完一组。
lblBarCode.Caption = sData '显示一组条形码
With lstBarCode
.AddItem Mid(sData, 1, EndPos - 1) '添加一组条形码到列表
End With
sData = "" '清空
End If
End Select
End Sub
呵呵,实际上读取简单的数据还是很简单的!
2.进制转换 (同样来源于互联网)
Function Hex2Bin(HexValue As String) As String '16进制转2进制
Const BinTbl = "0000000100100011010001010110011110001001101010111100110111101111"
Dim X As Integer
Dim Work1 As String
Work1 = ""
For X = 1 To Len(HexValue)
Work1 = Work1 + Mid(BinTbl, Val("&h" + Mid(HexValue, X, 1)) * 4 + 1, 4)
Next
Hex2Bin = Work1
End Function
Public Function Hex2Dec(InputData As String) As Double '16进制转10进制
Dim i As Integer
Dim DecOut As Double
Dim Lenhex As Integer
Dim HexStep As Double
DecOut = 0
InputData = UCase(InputData)
Lenhex = Len(InputData)
For i = 1 To Lenhex
If IsNumeric(Mid(InputData, i, 1)) Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "A" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "B" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "C" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "D" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "E" Then
GoTo NumOk
ElseIf Mid(InputData, i, 1) = "F" Then
GoTo NumOk
Else
Exit Function
End If
NumOk:
Next i
HexStep = 0
For i = Lenhex To 1 Step -1
HexStep = HexStep * 16
If HexStep = 0 Then
HexStep = 1
End If
If Mid(InputData, i, 1) = "0" Then
DecOut = DecOut + (0 * HexStep)
ElseIf Mid(InputData, i, 1) = "1" Then
DecOut = DecOut + (1 * HexStep)
ElseIf Mid(InputData, i, 1) = "2" Then
DecOut = DecOut + (2 * HexStep)
ElseIf Mid(InputData, i, 1) = "3" Then
DecOut = DecOut + (3 * HexStep)
ElseIf Mid(InputData, i, 1) = "4" Then
DecOut = DecOut + (4 * HexStep)
ElseIf Mid(InputData, i, 1) = "5" Then
DecOut = DecOut + (5 * HexStep)
ElseIf Mid(InputData, i, 1) = "6" Then
DecOut = DecOut + (6 * HexStep)
ElseIf Mid(InputData, i, 1) = "7" Then
DecOut = DecOut + (7 * HexStep)
ElseIf Mid(InputData, i, 1) = "8" Then
DecOut = DecOut + (8 * HexStep)
ElseIf Mid(InputData, i, 1) = "9" Then
DecOut = DecOut + (9 * HexStep)
ElseIf Mid(InputData, i, 1) = "A" Then
DecOut = DecOut + (10 * HexStep)
ElseIf Mid(InputData, i, 1) = "B" Then
DecOut = DecOut + (11 * HexStep)
ElseIf Mid(InputData, i, 1) = "C" Then
DecOut = DecOut + (12 * HexStep)
ElseIf Mid(InputData, i, 1) = "D" Then
DecOut = DecOut + (13 * HexStep)
ElseIf Mid(InputData, i, 1) = "E" Then
DecOut = DecOut + (14 * HexStep)
ElseIf Mid(InputData, i, 1) = "F" Then
DecOut = DecOut + (15 * HexStep)
Else
End If
Next i
Hex2Dec = DecOut
eds:
End Function
Function N2Ten(Sour As String, N As Integer) As Double '任意进制转十进制 sour 是要转换的, n 是进制
e = 0
N2Ten = 0
For i = Len(Sour) To 1 Step -1
S = Mid(Sour, i, 1)
Select Case UCase(S)
Case "A": S0 = 10
Case "B": S0 = 11
Case "C": S0 = 12
Case "D": S0 = 13
Case "E": S0 = 14
Case "F": S0 = 15
Case Else
If InStr("0123456789", S) = 0 Then
N2Ten = -1
Exit Function
Else
S0 = Val(S)
End If
End Select
If S0 > N - 1 Then
N2Ten = -1
Exit Function
End If
N2Ten = N2Ten + S0 * N ^ e
e = e + 1
Next
End Function