用VB设计一段单片机与上位机通讯的程序的一些问题

qq_23728007 2018-05-28 11:04:36
打算用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 Function

Private 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 Sub

Private 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 Sub

Private 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 Sub

Private 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
...全文
2064 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
sichuanwww 2018-05-29
  • 打赏
  • 举报
回复
笨狗先飞 2018-05-28
  • 打赏
  • 举报
回复
没有通讯协议来保障通讯数据的话,通讯质量很糟糕的,程序时不时会出个错

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

7,763

社区成员

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

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