当前位置:编程学习 > VB >>

关于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 ,  基础类
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,