VB下关于串口通讯
刚开始接触VB。在串口通讯下执行以下代码,请各路大神解析下。一定要详细。谢谢
Private Sub MSComm1_OnComm()VB 串口
Dim i As Integer
Dim Buf As Integer
Dim strTemp As String
buffer = MSComm1.Input
Dim strRece As String '串口接收的数据
For i = 0 To UBound(buffer)
strTemp = CStr(Hex(buffer(i)))
If Len(strTemp) = 1 Then
strRece = strRece + "0" + strTemp
Else
strRece = strRece + strTemp
End If
Next
' Text1 = Text1 + strRece + Chr(13) + Chr(10)
If Len(strRece) >= 18 Then
Call ShowData(strRece)
' MSComm1.PortOpen = False
' TimerForTingdun.Enabled = True
' Debug.Print strRece
End If
'此处 表示如果 对光感采集遮挡住归 0 就触发情景号
' If CStr(intData) <= 1 Then
'If Buf <> intData Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
If intData <> Buf Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
Timer1.Enabled = False
TimerForTingdun.Enabled = True
ConnOpen
connSql.Execute "usp_CallSceneStep " & m_iqjh
MsgBox ("存储过程执行成功!") '2013-11-11
ConnClose
intData = Buf '光感值 = 当前光感值
Else
intData = Buf
MsgBox ("两次值相等!") '2013-11-15
Timer1.Enabled = True
TimerForTingdun.Enabled = False
End If
Debug.Print intData, Buf
Exit Sub
End Sub
'2013-11-11设法获取某一次和上一次strRece存储在变量中
'栈就是一种先进后出的数据结构
'堆是先进先出的数据结构
'显示光感值
Private Sub ShowData(strData As String) '注释于2013-11-07
'Dim intData As Integer
Dim sT As String
' sT = Left(strData, 10)
' sT = Right(sT, 2)
' sT = Left(strData, 2)
Dim sql As String
Dim ssss As String
' Debug.Print Now & "--" & strData
intData = "&H" + Mid$(strData, 9, 2) '获取光感值 从第9个开始截取2个字符, 十六进制转化成十进制整数可以输出光感值 05 03 04 00 1A 00 00 9E 34
'ssss = Format(CStr(intData / 10), "0.0")
Label1.Caption = CStr(Now()) + " 光感值:" + CStr(intData) 'Format(CStr(intData / 10), "0.###") '此句显示出当前的光感值 整数
End Sub
[解决办法]
Private Sub MSComm1_OnComm()
Dim i As Integer
Dim Buf As Integer
Dim strTemp As String
Dim strRece As String '串口接收的数据
'所有变量声明都要在代码之前
buffer = MSComm1.Input '这句将 MSComm 接收到的数据从缓存提取到 buffer 数组(要事先声明)。
'下面这段,将数组数据转换为十六进制串
For i = 0 To UBound(buffer)
'我喜欢用下面的一个语句替代循环中他原来下面的整段代码
'strRece = strRece & Right("0" & Hex(buffer(i)), 2)
strTemp = CStr(Hex(buffer(i))) '他首先将一个字节转换成 16 进制字符串,CStr 是多余的。因为 Hex 函数本身就是转换成 16 进制字符串。
If Len(strTemp) = 1 Then '如果转换出 1 个字符(<16),就要加前缀 0 来补齐到 2 个字符
strRece = strRece + "0" + strTemp '好的编程习惯是用字符串连接符 & 来取代 + 号
Else
strRece = strRece + strTemp
End If
Next
' Text1 = Text1 + strRece + Chr(13) + Chr(10)
If Len(strRece) >= 18 Then '如果接收到 9 个以上字节
Call ShowData(strRece) '这里他调用子程序将接收到的数据显示在 Label 中,并将 strRece 中的第 9-10(第 5 字节)放到另一个变量中
'intData = "&H" + Mid$(strData, 9, 2)
'Label1.Caption = CStr(Now()) & " 光感值:" & intData
' MSComm1.PortOpen = False
' TimerForTingdun.Enabled = True
' Debug.Print strRece
End If
'此处 表示如果 对光感采集遮挡住归 0 就触发情景号
' If CStr(intData) <= 1 Then
'If Buf <> intData Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
If intData <> Buf Then 'intData 为光感值 比较两次获取的光感值不同就触发事件
Timer1.Enabled = False
TimerForTingdun.Enabled = True
ConnOpen
connSql.Execute "usp_CallSceneStep " & m_iqjh
MsgBox ("存储过程执行成功!") '2013-11-11
ConnClose
intData = Buf '光感值 = 当前光感值 '这句是错误的,应该如下句
'Buf = intData
Else
intData = Buf '这句是多余的
MsgBox ("两次值相等!") '2013-11-15
Timer1.Enabled = True
TimerForTingdun.Enabled = False
End If
Debug.Print intData, Buf
Exit Sub
End Sub
'2013-11-11设法获取某一次和上一次strRece存储在变量中
'栈就是一种先进后出的数据结构
'堆是先进先出的数据结构
'显示光感值
Private Sub ShowData(strData As String) '注释于2013-11-07
'Dim intData As Integer
Dim sT As String
' sT = Left(strData, 10)
' sT = Right(sT, 2)
' sT = Left(strData, 2)
Dim sql As String
Dim ssss As String
' Debug.Print Now & "--" & strData
intData = "&H" + Mid$(strData, 9, 2) '获取光感值 从第9个开始截取2个字符, 十六进制转化成十进制整数可以输出光感值 05 03 04 00 1A 00 00 9E 34
'ssss = Format(CStr(intData / 10), "0.0")
Label1.Caption = CStr(Now()) + " 光感值:" + CStr(intData) 'Format(CStr(intData / 10), "0.###") '此句显示出当前的光感值 整数
End Sub