打算用VB编写一段程序 实现将单片机的采集到的数据每8个数上传一次 上位机将这8个数的数值分别显示出来并分别绘制成曲线
现只能采集一个数的 且没有单片机的通讯程序 求大神们补充改进下Dim T As Variant
Dim c As Variant
Dim Y As Integer
Dim Y1 As Integer
Private Declare Sub Sleep Lib "kernel32 " (ByVal dwMilliseconds As Long) 'API,用sleep实现延时
'延时函数
Function delay(number)
    Call Sleep(number)
    DoEvents
End FunctionPrivate Sub Combo1_Click() '选择端口
    If Combo1.Text = "COM1" Then
    MSComm1.CommPort = 1
    ElseIf Combo1.Text = "COM2" Then
    MSComm1.CommPort = 2
    ElseIf Combo1.Text = "COM3" Then
    MSComm1.CommPort = 3
    ElseIf Combo1.Text = "COM4" Then
    MSComm1.CommPort = 4
    ElseIf Combo1.Text = "COM5" Then
    MSComm1.CommPort = 5
    ElseIf Combo1.Text = "COM6" Then
    MSComm1.CommPort = 6
    ElseIf Combo1.Text = "COM7" Then
    MSComm1.CommPort = 7
    Else
    MSComm1.CommPort = 8
    End If
End Sub
 
Private Sub Command3_Click() '停止采集
   Timer2.Enabled = False
   MSComm1.PortOpen = False
   Command2.Caption = "打开串口"
End Sub
 
Private Sub Form_Load() '初始化
    MSComm1.Settings = "9600,N,8,1"  '默认值为“9600,N,8,1”,意为“串口通信速度为9600Baud,无校验,每次数据为8个Bit,停止位为1个Bit”。
    MSComm1.InputMode = 0  '表示以文本(ASCII)方式取回数据
    MSComm1.RThreshold = 1  '每接收1个字节就产生一个OnComm 事件(接受事件)
    MSComm1.SThreshold = 0  '数据传输事件不会产生 OnComm 事件(发送事件)
    MSComm1.InBufferSize = 1024 '接受缓冲区大小
    MSComm1.OutBufferSize = 512 '发送缓冲区大小
    MSComm1.InBufferCount = 0   '清空接受缓冲区
    MSComm1.OutBufferCount = 0   '清空发送缓冲区
    Combo1.AddItem "COM1"
    Combo1.AddItem "COM2"
    Combo1.AddItem "COM3"
    Combo1.AddItem "COM4"
    Combo1.AddItem "COM5"
    Combo1.AddItem "COM6"
    Combo1.AddItem "COM7"
    Combo1.AddItem "COM8"
   
    Picture1.Scale (-50, 1150)-(1150, -80)
    Command1.Caption = "采集数据"   '命名
    Command2.Caption = "打开串口"
    Timer1.Interval = 1000 '实时时钟的采集频率间隔
    Timer2.Interval = 25 '
    Timer2.Enabled = False  '停止Timer2
End Sub
 
Private Sub Command2_Click()
    If Command2.Caption = "打开串口" Then
    MSComm1.PortOpen = True
    Command2.Caption = "关闭串口"
    ElseIf Command2.Caption = "关闭串口" Then
    MSComm1.PortOpen = False
    Command2.Caption = "打开串口"
    End If
End Sub
 
 
Private Sub MSComm1_OnComm()     '触发事件
    If MSComm1.InBufferCount > 0 Then
    Text3.Text = MSComm1.Input '从缓冲区返回并删除字符。将串行输入寄存器的数据读出,并清除寄存器中已读取的数据。
    c = Val(Text3.Text)
    delay (50)
    End If
End SubPrivate Sub draw()
   
    Picture1.FontSize = "15" '设置字体大小
    Picture1.DrawWidth = 3
    Picture1.ForeColor = QBColor(0)
    Picture1.Cls
   
    Picture1.Line (0, 0)-(0, 1024) '纵坐标
    Picture1.Line (-10, 1012)-(0, 1024) '纵坐标箭头及y值
    Picture1.Line (10, 1012)-(-0, 1024)
    Picture1.PSet (10, 1024)
    Picture1.Print "热流值"
   
    Picture1.Line (0, 0)-(1024, 0) '横坐标
    Picture1.Line (1012, 10)-(1024, 0) '横坐标箭头及x值
    Picture1.Line (1012, -10)-(1024, 0)
    Picture1.PSet (1024, -10)
    Picture1.Print "时间"
   
    Picture1.DrawWidth = 4
    Picture1.FontSize = 8
    For Y = 0 To 1024 Step 8  '在横轴上对输入采样的步进值
    Next Y    For Y1 = 0 To 1024 Step 50  '在纵轴上所显示文字的步进值
    Picture1.PSet (0, Y1)
    Picture1.Print (Y1)
    Next Y1
    T = 0
    Timer2.Enabled = True
End SubPrivate Sub Picture1_MouseDOWN(Button As Integer, Shift As Integer, B As Single, A As Single) '"光标线读数"
    Text1.Text = B
    Text2.Text = A
End Sub
Private Sub Command1_Click() '开始采集
   Call draw
End Sub
 
Private Sub Text1_Change()End SubPrivate Sub Timer2_Timer() '画图
    Picture1.DrawWidth = 2
    Picture1.PSet (T, c), QBColor(13) 'PSet在图片框上绘制像素点,并指定颜色。n
     T = T + 5 '在横轴上的步进值
    If T > 1024 Then  '如果在横轴上的像素点大于1024,则重新开始绘制
    Call draw
    End If
End Sub
 
Private Sub Timer1_Timer() '显示时间
    Text4.Text = CStr(Time$())
End Sub

解决方案 »

  1.   

    没有通讯协议来保障通讯数据的话,通讯质量很糟糕的,程序时不时会出个错Private Sub MSComm1_OnComm()     '触发事件
        If MSComm1.InBufferCount > 0 Then
        Text3.Text = MSComm1.Input '从缓冲区返回并删除字符。将串行输入寄存器的数据读出,并清除寄存器中已读取的数据。
        c = Val(Text3.Text)
        delay (50) '<== 这个delay函数除了拖慢电脑速度,完全没有意义
        End If
    End Sub
    '=================================
    Private Sub MSComm1_OnComm()
        Dim C As Long, Data() As Byte
        Select Case MSComm1.CommEvent
            Case comEvReceive
                Do
                    C = MSComm1.InBufferCount
                    Sleep 10
                Loop Until C = MSComm1.InBufferCount
                Data = MSComm1.Input
               '一般接收代码需要这样处理,虽然你收到的是asc字符,但是最好用一个数组来接收,然后转成string,ascii值在128~254的符号用字符串来接收是可能丢失的
              Text3.text=strconv(Data,vbUnicode )'<=接收的这样可以直接转成字符串了,中间其实少了对数组的处理,这个需要自己把握。
            Case Else
        End Select
    End Sub
      

  2.   

    没有单片机通信协议,编写VB上位机程序是无法完成的。先用以下代码来接收单片机的全部数据到Text3文本框,再根据接收的内容来改写VB代码。
    Private Sub MSComm_OnComm()
        Select Case MSComm1.CommEvent
            Case 2
            strjieshou = strjieshou & MSComm1.Input '从缓冲区返回并删除字符。将串行输入寄存器的数据读出,并清除寄存器中已读取的数据
        End Select
        Text3 = strjieshou
    End Sub以上代码基于单片机发送ASCII字符。