打算用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
uj5u.com熱心網友回復:
沒有通訊協議來保障通訊資料的話,通訊質量很糟糕的,程式時不時會出個錯
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
uj5u.com熱心網友回復:
沒有單片機通信協議,撰寫VB上位機程式是無法完成的。先用以下代碼來接收單片機的全部資料到Text3文本框,再根據接收的內容來改寫VB代碼。Private Sub MSComm_OnComm()
Select Case MSComm1.CommEvent
Case 2
strjieshou = strjieshou & MSComm1.Input '從緩沖區回傳并洗掉字符。將串行輸入暫存器的資料讀出,并清除暫存器中已讀取的資料
End Select
Text3 = strjieshou
End Sub
以上代碼基于單片機發送ASCII字符。
uj5u.com熱心網友回復:
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/45222.html
標籤:VB基礎類
上一篇:求助: 怎么用VBA把提取的CAD中的塊的屬性資料輸出到TXT文本
下一篇:vb檔案操作
