VB和51串口通信

2020-02-01 16:32发布

写了一个VB的串口程序,用来调试指南针和加速度的。本人第一次写VB的程序。在网上找了两天,自己边写边找,总算是弄出了一个东西。但是目前的问题是上位机的程序感觉响应的速度很慢。不知道什么原因。请大侠指教。程序和界面如下。



Dim mouse As Boolean
Dim uart_len As Byte
Dim REC_DATA(12) As String
Dim MAX_AX, MAX_AY, MAX_AZ, MIN_AX, MIN_AY, MIN_AZ As Single
Dim MAX_HX, MAX_HY, MAX_HZ, MIN_HX, MIN_HY, MIN_HZ As Single

Private Sub Combo1_Click()
If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
    Command1.Caption = "打开串口"
End If
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
End If
End Sub


Private Sub Combo2_Click()

If MSComm1.PortOpen = True Then
    MSComm1.PortOpen = False
    Command1.Caption = "打开串口"
End If
If Combo2.Text = "4800" Then
    MSComm1.Settings = "4800,n,8,1"
ElseIf Combo1.Text = "9600" Then
    MSComm1.Settings = "9600,n,8,1"
ElseIf Combo1.Text = "19200" Then
    MSComm1.Settings = "19200,n,8,1"

End If

End Sub

Private Sub Command1_Click()

    If Combo1.Text = "COM4" And Command1.Caption = "打开串口" Then
        MSComm1.PortOpen = True
        Command1.Caption = "关闭串口"
    ElseIf Combo1.Text = "COM4" And Command1.Caption = "关闭串口" Then
   
        MSComm1.PortOpen = False
        Command1.Caption = "打开串口"
    End If

End Sub

Private Sub Form_Load()

   
    Dim DR_X, DR_Y As Single
   
    MSComm1.CommPort = 4
    MSComm1.Settings = "9600,n,8,1"
    MSComm1.InputMode = comInputModeBinary
    MSComm1.InputLen = 1
    MSComm1.InBufferSize = 1
    MSComm1.RThreshold = 1
   
    'MSComm1.PortOpen = True
    Command1.Caption = "打开串口"
    Combo1.AddItem "COM1"
    Combo1.AddItem "COM2"
    Combo1.AddItem "COM3"
    Combo1.AddItem "COM4"
   
    Combo2.AddItem "4800"
    Combo2.AddItem "9600"
    Combo2.AddItem "19200"
   
    Combo1.Text = "COM4"
    Combo2.Text = "9600"
    Label_X.Caption = "AX"
    Label_Y.Caption = "AY"
    Text1(0).Text = MAX_AX
    Text1(1).Text = MIN_AX
    Text1(2).Text = MAX_HX
    Text1(3).Text = MIN_HX
   
    Text2(0).Text = MAX_AY
    Text2(1).Text = MIN_AY
    Text2(2).Text = MAX_HY
    Text2(3).Text = MIN_HY
   
    Text3(0).Text = MAX_AZ
    Text3(1).Text = MIN_AZ
    Text3(2).Text = MAX_HZ
    Text3(3).Text = MIN_HZ
   
    For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
   
   
End Sub


Private Sub MSComm1_OnComm()

   
    Dim i As Byte
    Dim BIT_REC_OVER As Boolean
    Dim DATA_AX, DATA_AY, DATA_AZ As Single
   
    Dim DATA_HX, DATA_HY, DATA_HZ As Single
   
   
    Dim DISPLAY_X, DISPLAY_Y As Single
    Dim aa As String
   
   
    Select Case MSComm1.CommEvent
   
    Case comEvReceive
        
        aa = MSComm1.Input
     
        
        aa = AscB(aa)
        'Text4.Text = Text4.Text + aa
        
        If aa = "2" And uart_len = 0 Then
   
            
            REC_DATA(uart_len) = aa
            uart_len = uart_len + 1
        ElseIf uart_len <> 0 And aa <> "2" Then
            REC_DATA(uart_len) = aa
            uart_len = uart_len + 1
            'Text1(0).Text = uart_len
            If uart_len = 13 Then
               uart_len = 0
                BIT_REC_OVER = True
            End If

        ElseIf aa = "2" And uart_len > 0 Then
            uart_len = 0
        Else
            uart_len = 0
            BIT_REC_OVER = False
        End If
    End Select
   
   
   
   
    If BIT_REC_OVER = True Then
        
        
        
        If REC_DATA(1) >= "16" And REC_DATA(1) < "32" Then
        
                                               'AX
            
            DATA_AX = ((REC_DATA(1) And &HF) * (2 ^ 12))
            
            DATA_AX = (DATA_AX + ((REC_DATA(2) And &HF) * (2 ^ 8)))
            
            DATA_AX = (DATA_AX + ((REC_DATA(3) And &HF) * (2 ^ 4)))
            
            DATA_AX = (DATA_AX + ((REC_DATA(4) And &HF)))
            
            'Text1(0).Text = DATA_AX
            If DATA_AX > 32767 Then
            DATA_AX = DATA_AX - 65535
            End If
            If DATA_AX > MAX_AX Then
            MAX_AX = DATA_AX
            Text1(0).Text = MAX_AX
            
            End If
            If DATA_AX < MIN_AX Then
            MIN_AX = DATA_AX
            Text1(1).Text = MIN_AX
            
            End If
            
            
        'Case &H20                                                   'AY
            DATA_AY = ((REC_DATA(5) And &HF) * (2 ^ 12))
            
            DATA_AY = DATA_AY + ((REC_DATA(6) And &HF) * (2 ^ 8))
            
            DATA_AY = DATA_AY + ((REC_DATA(7) And &HF) * (2 ^ 4))
            
            DATA_AY = DATA_AY + ((REC_DATA(8) And &HF))
            If DATA_AY > 32767 Then
            DATA_AY = DATA_AY - 65535
            End If
            
            If DATA_AY > MAX_AY Then
            MAX_AY = DATA_AY
            Text2(0).Text = MAX_AY
            
            End If
            If DATA_AY < MIN_AY Then
            MIN_AY = DATA_AY
            Text2(1).Text = MIN_AY
            
            End If
            
            
       ' Case &H30                                                  'AZ
            DATA_AZ = ((REC_DATA(9) And &HF) * (2 ^ 12))
            
            DATA_AZ = DATA_AZ + ((REC_DATA(10) And &HF) * (2 ^ 8))
            
            DATA_AZ = DATA_AZ + ((REC_DATA(11) And &HF) * (2 ^ 4))
            
            DATA_AZ = DATA_AZ + ((REC_DATA(12) And &HF))
            If DATA_AZ > 32767 Then
            DATA_AZ = DATA_AZ - 65535
            End If
            
            If DATA_AZ > MAX_AZ Then
            MAX_AZ = DATA_AZ
            Text3(0).Text = MAX_AZ
            
            End If
            If DATA_AZ < MIN_AZ Then
            MIN_AZ = DATA_AZ
            Text3(1).Text = MIN_AZ
            
            End If
   
     ElseIf REC_DATA(1) >= "64" And REC_DATA(1) < "80" Then                                                'HX
            DATA_HX = ((REC_DATA(1) And &HF) * (2 ^ 12))
            
            DATA_HX = DATA_HX + ((REC_DATA(2) And &HF) * (2 ^ 8))
            
            DATA_HX = DATA_HX + ((REC_DATA(3) And &HF) * (2 ^ 4))
            
            DATA_HX = DATA_HX + ((REC_DATA(4) And &HF))
            If DATA_HX > 32767 Then
            DATA_HX = DATA_HX - 65535
            End If
            
            If DATA_HX > MAX_HX Then
            MAX_HX = DATA_HX
            Text1(2).Text = MAX_HX
            
            End If
            If DATA_HX < MIN_HX Then
            MIN_HX = DATA_HX
            Text1(3).Text = MIN_HX
            
            End If
        
        'Case &H50                                                  'HY
            DATA_HY = ((REC_DATA(5) And &HF) * (2 ^ 12))
            
            DATA_HY = DATA_HY + ((REC_DATA(6) And &HF) * (2 ^ 8))
            
            DATA_HY = DATA_HY + ((REC_DATA(7) And &HF) * (2 ^ 4))
            
            DATA_HY = DATA_HY + ((REC_DATA(8) And &HF))
            If DATA_HY > 32767 Then
            DATA_HY = DATA_HY - 65535
            End If
            
            
            If DATA_HY > MAX_HY Then
            MAX_HY = DATA_HY
            Text2(2).Text = MAX_HY
            
            End If
            If DATA_HY < MIN_HY Then
            MIN_HY = DATA_HY
            Text2(3).Text = MIN_HY
            End If
       ' Case &H60                                                  'HZ
            DATA_HZ = ((REC_DATA(9) And &HF) * (2 ^ 12))
            
            DATA_HZ = DATA_HZ + ((REC_DATA(10) And &HF) * (2 ^ 8))
            
            DATA_HZ = DATA_HZ + ((REC_DATA(11) And &HF) * (2 ^ 4))
            
            DATA_HZ = DATA_HZ + ((REC_DATA(12) And &HF))
            
            If DATA_HZ > 32767 Then
            DATA_HZ = DATA_HZ - 65535
            End If
            
             If DATA_HZ > MAX_HZ Then
            MAX_HZ = DATA_HZ
            Text3(2).Text = MAX_HZ
            
            End If
            If DATA_HZ < MIN_HZ Then
            MIN_HZ = DATA_HZ
            Text3(3).Text = MIN_HZ
            End If
    End If
        
        
        
        
        If Option1.Value = True Then                                'AX-AY
        DISPLAY_X = 7500 + (DATA_AX * 4)
        DISPLAY_Y = 5000 - (DATA_AY * 4)
        ElseIf Option2.Value = True Then                            'AX-AZ
        DISPLAY_X = 7500 + (DATA_AX * 4)
        DISPLAY_Y = 5000 - (DATA_AZ * 4)
        ElseIf Option3.Value = True Then                            'AY-AZ
        DISPLAY_X = 7500 + (DATA_AY * 4)
        DISPLAY_Y = 5000 - (DATA_AZ * 4)
        ElseIf Option4.Value = True Then                            'HX-HY
        DISPLAY_X = 7500 + (DATA_HX * 4)
        DISPLAY_Y = 5000 - (DATA_HY * 4)
        ElseIf Option5.Value = True Then                            'HX-HZ
        DISPLAY_X = 7500 + (DATA_HX * 4)
        DISPLAY_Y = 5000 - (DATA_HZ * 4)
        ElseIf Option6.Value = True Then                            'HY-HZ
        DISPLAY_X = 7500 + (DATA_HY * 4)
        DISPLAY_Y = 5000 - (DATA_HZ * 4)
        ElseIf Option7.Value = True Then
        
        
        End If
        
        BIT_REC_OVER = False
        
        Picture1.PSet (DISPLAY_X, DISPLAY_Y), RGB(0, 0, 255)
    End If

        
   
   
End Sub

Private Sub Option1_Click()

Label_X.Caption = "AX"
Label_Y.Caption = "AY"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X





End Sub

Private Sub Option2_Click()
Label_X.Caption = "AX"
Label_Y.Caption = "AZ"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub

Private Sub Option3_Click()
Label_X.Caption = "AY"
Label_Y.Caption = "AZ"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub

Private Sub Option4_Click()
Label_X.Caption = "HX"
Label_Y.Caption = "HY"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub

Private Sub Option5_Click()
Label_X.Caption = "HX"
Label_Y.Caption = "HZ"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub

Private Sub Option6_Click()
Label_X.Caption = "HY"
Label_Y.Caption = "HZ"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub

Private Sub Option7_Click()
Label_X.Caption = "X"
Label_Y.Caption = "Y"
Picture1.Picture = Nothing
Picture1.Picture = LoadPicture("")
For DR_X = 0 To 15000 Step 1
    Picture1.PSet (DR_X, 5000), RGB(255, 0, 0)
    Next DR_X
    For DR_Y = 0 To 10000 Step 1
        Picture1.PSet (7500, DR_Y), RGB(255, 0, 0)
    Next DR_Y
   
    For DR_Y = 0 To 4400 Step 400                                                                       '画Y轴坐标
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 5400 + DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
        For DR_Y = 0 To 4400 Step 400
        For DR_X = 7500 To 7550 Step 1
            Picture1.PSet (DR_X, 4600 - DR_Y), RGB(255, 0, 0)
        Next DR_X
    Next DR_Y
   
   
     For DR_X = 0 To 7200 Step 400                                                                      '画X轴坐标
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 + DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
   
        For DR_X = 0 To 7200 Step 400
        For DR_Y = 4950 To 5000 Step 1
            Picture1.PSet (7500 - DR_X, DR_Y), RGB(255, 0, 0)
        Next DR_Y
    Next DR_X
End Sub


(原文件名:QQ截图20111029110302.jpg)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
hepday
1楼-- · 2020-02-01 22:04
无师自通?第一次写还是第一次接触VB?
gameboy_xsc
2楼-- · 2020-02-02 03:25
没有通啊。现在这个问题目前暂时无解。苦恼中。
cuikai12345
3楼-- · 2020-02-02 03:52
 精彩回答 2  元偷偷看……
turf456
4楼-- · 2020-02-02 07:09
多采几个再触发
yyccaa
5楼-- · 2020-02-02 11:29
除了接收阀值外,PSet是比较花时间的方法。
另外,Dim DATA_AX, DATA_AY, DATA_AZ As Single 在vb6中,这种写法只有最后一个变量是Single,前面的都是变体,变体的操作效率比较低。
gameboy_xsc
6楼-- · 2020-02-02 15:59
请问画点的话还有什么方法比较好呢?

一周热门 更多>