gameboy_xsc 发表于 2011-10-29 11:03:58

VB和51串口通信

写了一个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

http://cache.amobbs.com/bbs_upload782111/files_47/ourdev_689809NYDT79.jpg
(原文件名:QQ截图20111029110302.jpg)

hepday 发表于 2011-10-29 11:48:13

无师自通?第一次写还是第一次接触VB?

gameboy_xsc 发表于 2011-10-29 15:18:47

没有通啊。现在这个问题目前暂时无解。苦恼中。

cuikai12345 发表于 2011-10-29 17:26:26

你是不是没有设置触发接受时的接受字节显示啊?导致每接受1个字节都进入触发程序进行判断,使得程序响应的速度很慢、很慢



               '设一次读入的长度,可根据数据格式设置
                  Mscomm.ComPort.InputLen = 数据长度
                  '设置接收事件触发的阀值
                  Mscomm.ComPort.RThreshold = 数据长度

turf456 发表于 2011-10-29 18:04:18

多采几个再触发

yyccaa 发表于 2011-10-29 18:16:27

除了接收阀值外,PSet是比较花时间的方法。
另外,Dim DATA_AX, DATA_AY, DATA_AZ As Single 在vb6中,这种写法只有最后一个变量是Single,前面的都是变体,变体的操作效率比较低。

gameboy_xsc 发表于 2011-11-1 10:56:57

请问画点的话还有什么方法比较好呢?

liuyipeng 发表于 2011-11-5 12:21:11

鼠标中的滑轮看你程序的时候给坏了

生活 发表于 2012-12-15 14:36:46

搞出来没
页: [1]
查看完整版本: VB和51串口通信