读书人

VB停关于串口通讯

发布时间: 2013-11-29 13:49:33 作者: rapoo

VB下关于串口通讯
刚开始接触VB。在串口通讯下执行以下代码,请各路大神解析下。一定要详细。谢谢

Private Sub MSComm1_OnComm()

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
VB 串口


[解决办法]

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


代码写得有点“邋遢”。

读书人网 >VB

热点推荐