VB读取智能温湿度显示不变化

zhjie13 2012-08-19 05:20:50
小弟学编了一个VB显示存储温湿度的程序,能读,也能写入ACCESS表中,每当温湿度计送过来信息时,能读进表中,但数值永远是第一次的,用串口助手读看出,每次送过来的是不一样的值。
附上程序请高手指点:
'串口模块
Public Sub MyCom(MSComm1 As MSComm)
On Error GoTo ErrHandle

With MSComm1
.CommPort = 3
'使用COM3
.Settings = "9600,N,8,1" '设置通信口参数
.InBufferSize = 60 '设置MSComm1接收缓冲区为40字节
.OutBufferSize = 2 '设置MSComm1发送缓冲区为2字节
.InputMode = comInputModeBinary '设置接收数据模式为文本式
.InputLen = 1 '设置Input 一次从接收缓冲读取字节数为1
.SThreshold = 1 '设置Output 一次从发送缓冲读取字节数为1
.RThreshold = 1 '接收缓冲区每收到一个,触发
.InBufferCount = 0 '清除接收缓冲区
.OutBufferCount = 0 '清除发送缓冲区
If .PortOpen = False Then
.PortOpen = True
End If
End With
Exit Sub
ErrHandle:
MsgBox "通讯口打不开,请检查"

End Sub
'这是向温度计发送读的命令
Public Sub mySend(bytHex() As Byte)
ReDim bytHex(7) As Byte
ReDim bytHex(7)
bytHex(0) = &H1
bytHex(1) = &H4
bytHex(2) = &H0
bytHex(3) = &H0
bytHex(4) = &H0
bytHex(5) = &H2
bytHex(6) = &H71
bytHex(7) = &HFB
End Sub

Dim datatempA As Single '这是采样温湿度值
Dim datatempB As Single '这是采样温湿度值
Dim num As Integer '这是采样温湿度个数
Dim bytHex() As Byte
Dim InByte(1000) As Byte '串口接收数据用
Dim buffer As String
Dim Varp As Variant
Private Declare Sub Sleep Lib "Kernel32" (ByVal dwMilliseconds As Long) '-----Sleep函数 延时函数
'将收到的内容串联出来,因为COM口是接到一个触发一次
Private Sub SwichVar(ByVal nNum As Integer)
Sleep (10)
Varp = Null
Varp = MSComm1.Input
InByte(nNum) = Varp(0)

End Sub
Private Sub Form_Load()

'这是调用串口
MyCom MSComm1

'使时钟有效
Timer3.Enabled = True
End Sub
Private Sub MSComm1_OnComm()
Dim datatemp1, datatemp2 As String
Call Sleep(50)

If MSComm1.CommEvent = 2 Then
MSComm1.RThreshold = 0
Dim i
For i = 1 To MSComm1.InBufferCount
SwichVar i
buffer = buffer & Right("00" & Hex(InByte(i)), 2) & Chr(32)
Next i
Text1.Text=buffer '在这能看到接到的数据
datatemp1 = Mid(buffer, 10, 5)
datatempA = Val("&H" & datatemp1)
TempText.Text = (datatempA - 4000) / 100
datatemp2 = Mid(buffer, 16, 5)
datatempB = Val("&H" & datatemp2)
AverText.Text = datatempB / 100
Adodc3.ConnectionString = cnn.ConnectionString
Adodc3.RecordSource = "select * from Table_temp"
Adodc3.Refresh
If Adodc3.Recordset.RecordCount > 0 Then
Adodc3.Recordset.MoveLast
End If
cnn.Execute ("insert into Table_temp (温度值,湿度值)values('" & TempText & "','" & AverText & "')")



MSComm1.RThreshold = 1

End If
End Sub
...全文
305 5 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
sosoben 2012-08-21
  • 打赏
  • 举报
回复
COM口是接到一个触发一次,那为什么要 For i = 1 To MSComm1.InBufferCount

给段别人的温度计程序你参考下
Private Sub MSComm1_OnComm()
Dim Inbyte() As Byte
Dim buffer As String
Dim datatemp2a, datatemp2b As String
Dim datatemp2 As String
Dim datastr(20) As String
If num > 199 Then Call renew
'读取仪表返回数据串
Select Case MSComm1.CommEvent
Case comEvReceive
Inbyte = MSComm1.Input
For i = LBound(Inbyte) To UBound(Inbyte)
buffer = buffer + Hex(Inbyte(i)) + Chr(32)
Next i
Case comEvSend
End Select
'获取十六进制测量数据
If Len(Trim(Mid(buffer, 1, 2))) = 1 Then
datatemp2a = Str("0") & Trim(Mid(buffer, 1, 2))
Else
datatemp2a = Mid(buffer, 1, 2)
End If
If Len(Trim(Mid(buffer, 3, 2))) = 1 Then
datatemp2b = Str("0") & Trim(Mid(buffer, 3, 2))
Else
datatemp2b = Mid(buffer, 3, 2)
End If
datatemp2 = datatemp2a & " " & datatemp2b

'获取十进制测量数据(方法一)
For i = 1 To 5
datastr(i) = Mid(buffer, i, 1)
Next i
If datastr(2) = " " And datastr(4) <> " " Then
datatemp(num) = (Val("&H" & datastr(3)) * (16 ^ 3) + Val("&H" & datastr(4)) * (16 ^ 2) _
+ Val("&H" & "0") * (16 ^ 1) + Val("&H" & datastr(1)) * (16 ^ 0)) * 0.1
End If
If datastr(2) = " " And datastr(4) = " " Then
datatemp(num) = (Val("&H" & "0") * (16 ^ 3) + Val("&H" & datastr(3)) * (16 ^ 2) _
+ Val("&H" & "0") * (16 ^ 1) + Val("&H" & datastr(1)) * (16 ^ 0)) * 0.1
End If
If datastr(3) = " " And datastr(5) <> " " Then
datatemp(num) = (Val("&H" & datastr(4)) * (16 ^ 3) + Val("&H" & datastr(5)) * (16 ^ 2) _
+ Val("&H" & datastr(1)) * (16 ^ 1) + Val("&H" & datastr(2)) * (16 ^ 0)) * 0.1
End If
If datastr(3) = " " And datastr(5) = " " Then
datatemp(num) = (Val("&H" & "0") * (16 ^ 3) + Val("&H" & datastr(4)) * (16 ^ 2) _
+ Val("&H" & datastr(1)) * (16 ^ 1) + Val("&H" & datastr(2)) * (16 ^ 0)) * 0.1
End If

'获取十进制测量数据(方法二)
'If Len(Trim(Mid(buffer, 1, 2))) = 1 Then
'datatemp(num) = Val("&H" & Mid(buffer, 3, 2) & Str("0") & Mid(buffer, 1, 2)) * 0.1
'Else
'datatemp(num) = Val("&H" & Mid(buffer, 3, 2) & Mid(buffer, 1, 2)) * 0.1
'End If
'显示测量温度值
'将16进制转换成10进制
If datatemp(num) <> 0 Then
Grid.Row = num + 1
Grid.Col = 1: Grid.Text = Mid(buffer, 1, 5) '第1列显示16进制温度值
Grid.Col = 2: Grid.Text = datatemp(num) '第2列显示10进制温度值

TempText = Format$(datatemp(num), "0.0") '10进制显示,保留一位小数
'Text2.Text = datatemp2 '16进制显示,自己添加
num = num + 1
Call cal '调用计算极值、平均值子程序
Call draw '调用绘曲线过程
End If
End Sub
zhjie13 2012-08-20
  • 打赏
  • 举报
回复
谢谢! 楼上的师傅给予的指点和帮助。
你那提示的内容,我按此做了,但还是没有能实现text1.text每收到一条,就能清除前面的,而显示后面的。
不过,我从你那学了下,将buffer="" 移植到后面,好像是可以了。
If MSComm1.CommEvent = 2 Then
MSComm1.RThreshold = 0
Dim i
For i = 1 To MSComm1.InBufferCount
SwichVar i
buffer = buffer & Right("00" & Hex(InByte(i)), 2) & Chr(32)
Next i
Text1.Text=buffer '在这能看到接到的数据
datatemp1 = Mid(buffer, 10, 5)
datatempA = Val("&H" & datatemp1)
TempText.Text = (datatempA - 4000) / 100
datatemp2 = Mid(buffer, 16, 5)
datatempB = Val("&H" & datatemp2)
AverText.Text = datatempB / 100
Adodc3.ConnectionString = cnn.ConnectionString
Adodc3.RecordSource = "select * from Table_temp"
Adodc3.Refresh
If Adodc3.Recordset.RecordCount > 0 Then
Adodc3.Recordset.MoveLast
End If
cnn.Execute ("insert into Table_temp (温度值,湿度值)values('" & TempText & "','" & AverText & "')")

buffer=" "
MSComm1.RThreshold = 1

End If
End Sub
但这样做,我认为有个前提,就是程序处理完前,即还没有运行到buffer=" "
这句时,没有收到第二次触发mscomm1的信号,不然,程序还是没有办法读到第二次的信息变化的,
也就是您说的,text1.text前端内容没有变化。
还有,我看了串口的一些程序,好像都没有将信息读到时,就将前面读到的删去,只显示当前读到的内容,而是连续下去的,不知有没有这方面的介绍或程序。
谢谢你!
of123 2012-08-20
  • 打赏
  • 举报
回复

如果你的温湿度数据是固定长度的,大可不必费那么多周章。

1 RThreshold = 12 '接收缓冲区收到12个触发,加入你的温湿度数据是 12 字节

2 可以去掉 Sleep 延时

3 直接读入数据:

Dim bytTmp() As Byte

bytTmp = MSComm1.Input

buffer = ""

For i = 0 To Ubound(bytTmp)

buffer = buffer & Right("00" & Hex(bytTmp(i)), 2) & Chr(32)

......

多说一句,你不用为串口开缓存,在 Driver 中已经有了。我们所谓的接收,只是等待 Driver 完成接收并从它的缓存中复制数据。


of123 2012-08-20
  • 打赏
  • 举报
回复
问题出在这一句:

buffer = buffer & Right("00" & Hex(InByte(i)), 2) & Chr(32)

你运行后第一次收到的数据永远占据着 Buffer 的前端。
贝隆 2012-08-19
  • 打赏
  • 举报
回复
你的代码有问题,参阅:http://download.csdn.net/detail/veron_04/1262066

7,785

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧