关于vb串口通讯的问题
我现在用vb编写了一个上位机实时读取电离真空计读数的程序,按照厂家的Modbus RTU通讯协议可以读取真空数据,但会很频繁的出现乱码,对此我试了很多种方法,但还是不行,在这里请教高人,希望能给我一个方法。下面附上我写的程序和通讯协议,现在这里谢谢大家了。Option Explicit
Dim num As Integer
Dim Timer As Integer
Dim recstr As String
Private Sub Form_Load()
MSComm1.CommPort = 3
MSComm1.InputMode = comInputModeText
MSComm1.RThreshold = 9 '触发oncomm事件的标志'
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputLen = 0
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 512
MSComm1.PortOpen = True
MSComm1.InBufferCount = 0
MSComm1.OutBufferCount = 0
Timer1.Enabled = False
End Sub
Private Sub Command2_Click()
Timer = Val(Text2.Text)
Timer1.Interval = Timer
End Sub
'开始采集
Private Sub Cmdstart_Click()
'Timer1.Interval = Timer
Timer1.Enabled = True
'MSComm1.PortOpen = True
If Cmdstart.Caption = "开始" Then
Command2.Enabled = False
Cmdstart.Enabled = False
End If
End Sub
'停止采集
Private Sub Cmdstop_Click()
Timer1.Enabled = False
'MSComm1.PortOpen = False
If Cmdstop.Caption = "停止" Then
Command2.Enabled = True
Cmdstart.Enabled = True
End If
End Sub
'每隔一定时间向仪表发送读数据命令串
Private Sub Timer1_Timer()
Dim sendSj(7) As Byte
sendSj(0) = &H1
sendSj(1) = &H3
sendSj(2) = &H0
sendSj(3) = &H6B
sendSj(4) = &H0
sendSj(5) = &H0
sendSj(6) = &H0
sendSj(7) = &H0
MSComm1.Output = sendSj
End Sub
Private Sub MSComm1_OnComm()
Dim sinstr(3) As String
Dim Par, Time As String
Select Case MSComm1.CommEvent '检验串口事件
Case comEvReceive '接收缓冲区有数据
recstr = MSComm1.Input
Text3.Text = recstr
sinstr(0) = Mid(recstr, 4, 1)
sinstr(1) = Mid(recstr, 5, 1)
sinstr(2) = Mid(recstr, 6, 2)
Text1.Text = sinstr(0) & "." & sinstr(1) & "E" & sinstr(2)
Time = Format$(Now, "c")
'存入到e盘文件夹内
Open "e:\rec\Par.txt" For Random Access Write As #1
Par = Text1.Text
Close #1
Open "e:\rec\Par.txt" For Append As #1
Print #1, Time; " "; Par
Close #1
num = num + 1
recstr = ""
If num > Timer Then
Timer1.Enabled = False
End If
End Select
End Sub
Private Sub Command1_Click()
Dialog.Show
End Sub
1. 通讯设置:
波特率:9600
起始位:0
停止位:1
数据位:8
2. 通讯格式
例从通讯地址01读数据
通讯地址 功能码 数据起始地址寄存器字节 数据读取个数寄存器字节 CRC16 低字节 CRC16 高字节
01H 03H 00H 6BH 00H 02H XXH XXH
响应数据帧
响应包含通讯地址,功能码,数据的数量和CRC16错误校验
例如显示真空度:5 . 0 E – 1
通讯地址 功能码 读取数据个数 数据1 数据2 数据3 数据4 CRC 16 低字节 CRC16高字节
01H 03H 04H 35H 30H 2DH 31H XXH XXH
数据内容:采用ASCII码
数据1是真空度的整数位: 35H
数据2是真空度的小数位: 30H
数据3是真空度的指数符号位: 2DH
数据4是真空度的指数位: 31H
开机上电显示“A”时,按“功能”键,显示出厂时的通讯地址,按“置数”键可以改变设定,设定好以后,再按“功能”键进入测量状态。如果是多台仪器同时通讯,请将每台仪器的通讯地址设定不一样,以免产生冲突,每一个显示窗口对应一个地址。
上位机发送通讯地址
真空计的地址按16进制作为一帧地址发出。例如真空计通讯地址:01,就按16进制01发送;例如真空计通讯地址:10,就按16进制0A发送。
仪器发送数据格式采用十六进制。
一帧数据
1 2-9 10
起始位0 地址
数据位 停止位1
--------------------编程问答-------------------- 既然都有通信协议了,应该不难了啊!你这个问题的关键在于CRC16 --------------------编程问答-------------------- 你使用这个串口调试器试一试,如果OK,你就根据它改写你的代码:
http://download.csdn.net/source/1262066
补充:VB , 基础类