討論區快速選單
知識庫快速選單
網路投保旅行平安險 政府補助!學嵌入式+物聯網 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
8051透過RS232傳輸到電腦用 VB 繪X-Y 圖
更改我的閱讀文章字型大小
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/6 下午 09:16:55
大家好:
  我最近在研究,如何把我用8051收到的電腦透過RS232傳到電腦,然後利用VB接收並畫出圖形,但我一直寫不出來,我目前只能收data,畫圖部份一直出不來,我參考了范逸之寫的那ㄧ本(Visual Basic與分散式監控系統/使用RS-232/485串列通訊),似乎還是沒出來,不知道是寫的方向不對,還是程式有錯,可否請高手幫幫忙,改怎麼寫?

目的:看了你很多VB設計的程式教學,覺得很厲害!!想請問一下,我現在利用8051收類比訊號,藉由RS232傳輸到電腦上,我利用VB寫了ㄧ個收DATA的程式,已經可以收數字了,但我還想做兩件是,不知道程式怎麼寫起:

1.ㄧ邊收data,可以顯現現在讀值

2.就是要順便把收到data,畫成圖型如示波器這樣,想問一下該怎麼做,是希望畫連續(意思是只要訊號沒停止,都一直畫下去)的圖型

謝謝你幫忙回答!!

作者 : 57805137(水瓶天賞) Visual Basic卓越專家貼文超過500則
[ 貼文 698 | 人氣 4505 | 評價 2720 | 評價/貼文 3.9 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/7 上午 08:55:37
直接拿書上的範例修改比較快
如果使用copy方式加入自己的表單,就要注意picture的屬性autoredraw=true
以前也有人問過picture怎麼畫圖的,你可以查依下以前的資料
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/8 上午 08:57:59
1.ㄧ邊收data,可以顯現現在讀值

a1: 使用Timer去讀資金
Private Sub Timer1_Timer()
    If (MSComm1.InBufferCount > 0) Then
     Rx = MSComm1.Input
     '...
    End If
End Sub
a2:使用OnComm
'MSComm1.RThreshold = 1 'or N
Private Sub MSComm1_OnComm()
    Select Case MSComm1.CommEvent
    Case comEvReceive
     Rx = MSComm1.Input
    End Select
End Sub

2.就是要順便把收到data,畫成圖型如示波器這樣,想問一下該怎麼做,是希望畫連續(意思是只要訊號沒停止,都一直畫下去)的圖型
A: 使用PictureBox當底,
Picture1.DrawWidth = 1
Picture1.Line (X1, Y1)-(X2, Y2), lngColor畫線 或
Picture1.PSet (X, Y), lngColor 畫點
'左上角座標為(0,0)
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/8 下午 08:01:52
首先感謝 kenton_lin(Kenton) & 水瓶天賞兩位高手的回答,不過我試了很久(三天),
還是沒有跑出來,所以我想說把我寫的程式放上來並將我的問題重新再敘述一遍,希望
大家可以再幫我看看,並為我解惑,再次感謝!!

目的:類比訊號透過8051經RS232傳輸到電腦上,用VB寫ㄧ個介面的接收程式

問題:目前我的程式可以收data,也可以顯示電壓直了,但我想要即時繪圖,X軸-時間、Y軸-電壓,但 一直出現debug,不知道那邊出了問題,可否請幫我看一下,並且為我解答.非常感激!!

Option Explicit

''''''''''''''''''''''''''''''''''''''
'使用命令按鈕控制項
'關閉通訊埠
'結束系統
''''''''''''''''''''''''''''''''''''''
Private Sub cmdEnd_Click()
  MSComm1.PortOpen = False
  End
End Sub

''''''''''''''''''''''''''''''''''''''
'使用命令按鈕控制項
'將計時器控制項的啟動/關閉狀態作切換
''''''''''''''''''''''''''''''''''''''
Private Sub cmdStart_Click()
  Timer1.Enabled = Not Timer1.Enabled
End Sub

''''''''''''''''''''''''''''''''''''''
'表單畫面的載入事件
'開啟通訊埠,通訊埠的參數也可以在此指定之後
'再行開啟通訊埠
''''''''''''''''''''''''''''''''''''''
Private Sub Form_Load()
Dim X(0 To 255) As Integer, Y(j) As Single
MSComm1.PortOpen = True
For i = 0 To 255 '先畫255點,X-時間,y-傳輸的電壓值,一秒對應一個電壓值
X(i) = i
Print i
Next i
Y(j) = txtReceive.Text + MSComm1.Input '這裡不知該如何寫?我想說收到的電壓值畫在Y軸
Picture1.DrawWidth = 1
If i = 0 Then
Picture1.PSet (X(i), Y(j)) '先畫成點
Else
Picture1.Line -(X(i), Y(j)) '連成線
End If
End Sub


Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
    Case comEvReceive
    End Select
End Sub

''''''''''''''''''''''''''''''''''''''
'計時器的Timer事件程序
'此事件會在每一個Interval屬性值的間隔內被呼叫一次
'程式檢查輸入緩衝區中是否有資料,若有資料
'則將此資料讀取後,指定給文字框的Text屬性
''''''''''''''''''''''''''''''''''''''
Private Sub Timer1_Timer()
  If MSComm1.InBufferCount > 0 Then
    txtReceive.Text = txtReceive.Text + MSComm1.Input
    txtReceive.Text = " "
  End If
End Sub

作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/9 上午 08:47:34
Dim mlngCounter As Long

Private Sub MSComm1_OnComm()

Select Case MSComm1.CommEvent
    Case comEvReceive
     Y(j) = CInt(MSComm1.Input) '這裡不知該如何寫?我想說收到的電壓值畫在Y軸
     mlngCounter = mlngCounter + 1
    End Select

End Sub

您的8051回傳是每秒一筆?還是下指令才回傳?放在OnComm事件裡接收比較合適吧!回傳的格式和有效位數是0.000~5.000?如果是這樣的話,考慮乘1000,畫在Y軸,X軸的時間應該是全域變數,參考看看吧!

作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/9 上午 09:57:18
感謝你的回答,是每秒ㄧ筆資料!!
我在試試看,不會再問,謝謝喔!!
作者 : friendlly(RacK)
[ 貼文 92 | 人氣 5952 | 評價 190 | 評價/貼文 2.07 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/9 上午 10:16:26
給個建議..你可以這樣試試看.. 因為只要架構出來了程式一定可以寫得出來

VB(PC) 端當Sever 端發命令讀取8051的資料, 8051必須等有命令才可以回傳

這樣PC端 要繪圖 or 要 讀資料..就是自己控制了

你可以全部讀完再畫圖, 也可以讀一次畫一次 當然裡面的判斷,要控制好...

這樣比較架構比較單純...

VB(pc) or 8051 兩端要交換 sever client 也可以 ...看你的寫法....

作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/10 上午 07:55:08
Dim X As Long
Dim Y As Long
Dim sngScaleVolt As Single
Dim sngScaleTime As Single

Private Sub Form_Resize()
    sngScaleVolt = Picture1.ScaleHeight \ conMaxVolt
    sngScaleTime = Picture1.ScaleWidth \ conMaxTime
End Sub

Private Sub Paint(strA As String)
    Dim sngVal As Single
    
    sngVal = strA
    X = sngVal * sngScaleVolt
    Y = Y + sngScaleTime
    Picture1.PSet (X, Y)
End Sub
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/10 上午 10:17:42
不好意思!!
問一個比較笨的問題:
Private Sub Form_Resize()
Private Sub Paint(strA As String)
分別代表什麼物件啊?
我看不太懂!!
請解釋ㄧ下!!謝謝!!
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/10 下午 12:07:42
Form_Resize計算X, Y軸的一格的單位值,
Y+1(時間加1秒), 要移動多少點
X+1(電壓1V) 要移動多少點
會跟畫面大小有關

Private Sub Timer1_Timer()
    Dim strA As String
  If MSComm1.InBufferCount > 0 Then
    strA = MSComm1.Input
    txtReceive.Text = txtReceive.Text + strA
    paint strA
  End If
End Sub
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/11 下午 06:24:08
sngScaleVolt = Picture1.ScaleHeight \ conMaxVolt
sngScaleTime = Picture1.ScaleWidth \ conMaxTime

conMaxVolt
conMaxTime 請問這兩個變數是什麼,我不太清楚ㄟ?

    謝謝!!
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/12 下午 08:43:34

conMaxVolt: Y軸最大範圍值, 顯示100V或10V
conMaxTime :X軸最大範圍值, 要顯示100秒的資料或3600秒或更多秒的資料
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 上午 12:23:26
不好意思各位!!
  我是了很久還是沒出來,已經照大家提供的建議去修改很多變,還是沒的到的結果,
我在想是不是 picture Box 設定的問題,我是直接拉圖,然後在 X-軸 & Y-軸 都沒有
任何的物件輸入,等於是空白圖形,這樣是否會有問題?

請大家在幫幫忙!!我試到已經想放棄了,謝謝大家!!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 上午 09:37:21
>不好意思各位!!
> 我是了很久還是沒出來,已經照大家提供的建議去修改很多變,還是沒的到的結果,
>我在想是不是 picture Box 設定的問題,我是直接拉圖,然後在 X-軸 & Y-軸 都沒有
>任何的物件輸入,等於是空白圖形,這樣是否會有問題?
>請大家在幫幫忙!!我試到已經想放棄了,謝謝大家!!

先試最簡單的,放一個按鈕,如以下,可以畫出線嗎?您的Picture的Height和Width是多少?該不會超過邊界了?要連線的點X, Y是多少呢?加油,快成功了喔!

Private Sub Command1_Click()

    Me.Picture1.Line (100, 100)-(100, 1000)

End Sub
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 12:04:57
沒錯,有一條線出來,但就沒反應了,所以我接下來把變數丟進去試?


Private Sub Command1_Click()
 Picture1.DrawWidth = 1
 Me.Picture1.PSet (X(i), Y(j)) '先畫成點
 Me.Picture1.Line (X(i), Y(j))-(X(i + 1), Y(j + 1)) '連成線
End Sub

 But:
 Me.Picture1.PSet (X(i), Y(j)) '先畫成點
 Me.Picture1.Line (X(i), Y(j))-(X(i + 1), Y(j + 1)) '連成線

這兩行 X(i) , Y(j)
一直出現必需出現是陣列,我不懂原因,也不知道為什麼,可以請大家在幫我看看,該怎麼改!!
謝謝大家!!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 01:02:44
Option Explicit

Dim X(1000) As Integer, Y(1000) As Integer

Private Sub Command1_Click()

    Dim i As Integer, j As Integer

    For i = 0 To 1000
     X(i) = i
     Y(i) = i
    
    Next i
    
    Picture1.DrawWidth = 1
    Me.Picture1.Cls
    
    For i = 1 To 1000
    
     For j = 1 To 1000
     Me.Picture1.PSet (X(i), Y(j)) '先畫成點
     Me.Picture1.Line (X(i - 1), Y(j - 1))-(X(i), Y(j)) '連成線
    
     DoEvents
    
     Next j
    
    Next i
    
End Sub

這樣應該會畫出一個方形吧!可以的話,接著把Y(j)填入您接收的電壓值!
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 02:15:52
非常感謝qazujm(joe),你的幫助和鼓勵,雖然還沒跑出來,但我知道應該快要成功了!!

我想先問幾個程式的問題,先把我的問題釐清:
妳的程式說的沒錯,的確可以跑出方形!!

But:
1. For i = 0 To 1000
     X(i) = i
     Y(i) = i
為什麼我把值改掉就會有問題啊,比如 i 改成 50 好了!! Debug 出現在
 Me.Picture1.PSet (X(i), Y(j)) '先畫成點 偵錯"陣列索引超出範圍"
這邊的 i 應該是代表陣列是 1000*1000 吧 !!那改50 ,不就代表 50*50陣列嘛!!

2.可是我的目的是希望:
電源由8051透過RS232傳到電腦,那出現在X-Y 座標值應該會有一串連續的值,及y軸的值,X-軸為時間對應值,那照道理我收到的值
For i = 1 To 1000
For j = txtReceive.Text + MSComm1.Input ?我改掉的部份,但bug 說程式不符合,不知道是寫法不對,還是輸入的電壓值(Y-軸)不對?
 i = i + 1 (表時間點數)

不好意思!!第一次接觸VB,所以很多觀念不懂,
感謝你的幫助,也謝謝你的回答!!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 03:27:55
>1. For i = 0 To 1000
> X(i) = i
> Y(i) = i
>為什麼我把值改掉就會有問題啊,比如 i 改成 50 好了!! Debug 出現在
> Me.Picture1.PSet (X(i), Y(j)) '先畫成點 偵錯"陣列索引超出範圍"
>這邊的 i 應該是代表陣列是 1000*1000 吧 !!那改50 ,不就代表 50*50陣列嘛!!

把您修改的全貼出來!

>2.可是我的目的是希望:
>電源由8051透過RS232傳到電腦,那出現在X-Y 座標值應該會有一串連續的值,及y軸的值,X-軸為時間對應值,那照道理我收到的值
>For i = 1 To 1000
>For j = txtReceive.Text + MSComm1.Input ?我改掉的部份,但bug 說程式不符合,不知道是寫法不對,還是輸入的電壓值(Y-軸)不對?
> i = i + 1 (表時間點數)

Option Explicit

Dim Y(1000) As Integer
Dim mintCounter As Integer

Private Sub Form_Load()

    mintCounter = 0

End Sub

Private Sub MSComm1_OnComm()

    Select Case MSComm1.CommEvent
    
    Case comEvReceive
     Y(mintCounter) = CInt(CDbl(MSComm1.Input) * 1000)
     mintCounter = mintCounter + 1
     Me.Picture1.PSet (mintCounter, Y(mintCounter)) '先畫成點
    
     If mintCounter > 0 Then
     Me.Picture1.Line (mintCounter, Y(mintCounter - 1))-(mintCounter, Y(mintCounter)) '連成線
    
     End If
    
    End Select

End Sub

這樣就可以了吧!上次就貼過了喔!如果還不行的話,先不要畫圖,用TextBox確認有收到8051的資料嗎?
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 07:32:15
還是感謝qazujm(joe)的幫忙,我目前照了你的方式改了很多次程式,最後一次改完,確定沒debug,但沒圖形,所以我想說把我的介面和程式碼都放上來,這樣應該比較清楚!!再次謝謝你!!

圖中 textbox: 是8051經RS232傳的資料,右邊是畫圖!!
http://www.wretch.cc/album/show.php?i=pow02162000&b=2&f=1525829735&p=1

程式碼部分:
Option Explicit
Dim X As Long
Dim Y As Long
Dim sngScaleVolt As Single
Dim sngScaleTime As Single

Private Sub Form_Resize()
sngScaleVolt = Picture1.ScaleHeight ' Y軸最大範圍值
sngScaleTime = Picture1.ScaleWidth 'X軸最大範圍值
End Sub

''''''''''''''''''''''''''''''''''''''
'使用命令按鈕控制項
'關閉通訊埠
'結束系統
''''''''''''''''''''''''''''''''''''''
Private Sub cmdEnd_Click()
  MSComm1.PortOpen = False
  End
End Sub
''''''''''''''''''''''''''''''''''''''
'使用命令按鈕控制項
'將計時器控制項的啟動/關閉狀態作切換
''''''''''''''''''''''''''''''''''''''
Private Sub cmdStart_Click()
Timer1.Enabled = Not Timer1.Enabled
End Sub


''''''''''''''''''''''''''''''''''''''
'表單畫面的載入事件
'開啟通訊埠,通訊埠的參數也可以在此指定之後
'再行開啟通訊埠
''''''''''''''''''''''''''''''''''''''
Private Sub Form_Load()
MSComm1.PortOpen = True
mintCounter = 0
End Sub

Private Sub MSComm1_OnComm()
Dim X(1000) As Integer, Y(1000) As Integer
Dim i As Integer
Dim mintCounter As Double
Select Case MSComm1.CommEvent
Case comEvReceive
For i = 0 To 1000
X(i) = i
Y(mintCounter) = CInt(CDbl(MSComm1.Input) * 1000)
mintCounter = mintCounter + 1
Next i
Picture1.DrawWidth = 1
Me.Picture1.Cls
If mintCounter > 0 Then
Me.Picture1.Line (mintCounter, Y(mintCounter - 1))-(mintCounter, Y(mintCounter)) '連成線
End If
End Select
End Sub

''''''''''''''''''''''''''''''''''''''
'計時器的Timer事件程序
'此事件會在每一個Interval屬性值的間隔內被呼叫一次
'程式檢查輸入緩衝區中是否有資料,若有資料
'則將此資料讀取後,指定給文字框的Text屬性
''''''''''''''''''''''''''''''''''''''
Private Sub Timer1_Timer()
If MSComm1.InBufferCount > 0 Then
txtReceive.Text = txtReceive.Text + MSComm1.Input
End If
End Sub

不好意思!!再請你幫我看看!!謝謝!!
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 08:46:04
唉!東拼西湊,改得亂七八糟!用OnComm事件,不要用Timer了!您的Picture1的Height和Width是多少?您知道表單全域變數和區域變數的差別嗎?接收電壓值是整數,還是有小數點?參考以下,其它的都註解吧!

Option Explicit

Dim Y(1000) As Integer
Dim mintCounter As Integer

Private Sub cmdEnd_Click()

    MSComm1.PortOpen = False
    End
  
End Sub

Private Sub Form_Load()

    MSComm1.PortOpen = True
    mintCounter = 0
    
End Sub

Private Sub MSComm1_OnComm()

    Dim i As Integer
    Dim strInput As String
    
    Select Case MSComm1.CommEvent
    
    Case comEvReceive
    
     If MSComm1.InBufferCount > 0 Then
     strInput = MSComm1.Input
     txtReceive.Text = txtReceive.Text & " " & strInput
     Y(mintCounter) = CInt(CDbl(strInput) * 1000)
     mintCounter = mintCounter + 1

     If mintCounter > 0 Then
     Me.Picture1.Line (mintCounter - 1, Y(mintCounter - 1))-(mintCounter, Y(mintCounter)) '連成線
    
     End If
    
     End If
    
    End Select
    
End Sub
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/14 下午 11:31:15
抱歉喔!!本人較為駑鈍!!
我想請教一下你的問題,並針對您提的問題回答,不對再請你糾正?
1.您說不要用Timer了,可是我timer 沒隔幾秒去自動讀取資料,才會顯示在 textbox,
在此有點不了解你的意思!!
2.Picture1的Height和Width是多少? 分別都是 0-10,X-軸:0-10V, Y-軸:10秒(取樣頻率 1000 HZ)
3.我知道應該要用全域變數去寫,不然用區域程式跑完就死掉了,用全域的話一點一點累積
電壓值,才可以畫線!!但這邊還不太清楚全域的寫法,還請您指點一下,謝謝!!
4.電壓值,我收到的部分應該都是整數(從textbox看到的),但我在硬體上是用可變電阻,調整電壓(電源供應5V),所以他應該是5/255 = 0.02 之間跳動(5表5V,255表8位元),所以電腦收到的值會是3433342323(textbox讀到的部分), 這樣跳動(當可變電組不再調動),所以不確定這樣電壓直算是”整數還是小數點”.

這是我的回答,還有我不太確定的地方,也請您糾正,謝謝你喔!!
 
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人simon0216117註記此篇回應為最佳解答 2008/4/15 上午 12:00:03
Dim X As Single 'long
Dim Y As Single 'long
Dim X1 As Single
Dim Y1 As Single
Dim sngScaleVolt As Single
Dim sngScaleTime As Single

Const conMaxVolt = 10 'Volt
Const conMaxTime = 3600 '秒

Private Sub Form_Load()
    Timer1.Interval = 500
    Timer1.Enabled = False
    Picture1.DrawWidth = 1
    Picture1.AutoRedraw = True
End Sub

Private Sub Form_Resize()
    sngScaleVolt = Picture1.ScaleHeight / conMaxVolt ' Y軸最大範圍值
    sngScaleTime = Picture1.ScaleWidth / conMaxTime 'X軸最大範圍值
End Sub

Private Sub cmdEnd_Click()
  MSComm1.PortOpen = False
  Unload Me
End Sub
Private Sub cmdStart_Click()
    X = 0
    Y = 0
    X1 = 0
    Y1 = Picture1.ScaleHeight '左下角
    Picture1.Cls
    MSComm1.PortOpen = True
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    Dim strA As String
    
    If MSComm1.InBufferCount > 0 Then
     strA = MSComm1.Input
     txtReceive.Text = txtReceive.Text & " " & strA
     X = X + 1 * sngScaleTime
     Y = Picture1.ScaleHeight - Val(strA) * sngScaleVolt
     Picture1.Line (X1, Y1)-(X, Y), vbBlack
     X1 = X
     Y1 = Y
    End If
End Sub

作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 上午 06:33:22
>抱歉喔!!本人較為駑鈍!!
>我想請教一下你的問題,並針對您提的問題回答,不對再請你糾正?
>1.您說不要用Timer了,可是我timer 沒隔幾秒去自動讀取資料,才會顯示在 textbox,
在此有點不了解你的意思!!
>2.Picture1的Height和Width是多少? 分別都是 0-10,X-軸:0-10V, Y-軸:10秒(取樣頻率 1000 HZ)
>3.我知道應該要用全域變數去寫,不然用區域程式跑完就死掉了,用全域的話一點一點累積
>電壓值,才可以畫線!!但這邊還不太清楚全域的寫法,還請您指點一下,謝謝!!
>4.電壓值,我收到的部分應該都是整數(從textbox看到的),但我在硬體上是用可變電阻,調整電壓(電源供應5V),所以他應該是5/255 = 0.02 之間跳動(5表5V,255表8位元),所以電腦收到的值會是3433342323(textbox讀到的部分), 這樣跳動(當可變電組不再調動),所以不確定這樣電壓直算是”整數還是小數點”.
>這是我的回答,還有我不太確定的地方,也請您糾正,謝謝你喔!!

一、因為您是新學,所以還無法這麼快理解內容!OnComm事件收資料,Timer也收資料,會造成干擾,您就先照樓上大大的範例試,他寫的,您可能比較容易理解!
二、這是您想在畫面呈現的類似示波器的樣子!我要問的是Picture1.Width和Height的屬性數值是多少?這會影響您繪圖,是否會超出邊界!
三、全域變數需宣告在最前面,您的時間和電壓需宣告為全域變數!
四、所以您一次回傳是十個字元嗎?3433342323是3.433342323V,這很重要,您要確定,到底是什麼?不然無法畫圖!8051韌體是您寫的嗎?您要弄清楚8051輸出的定義!建議8051的輸出為三個字元,從000到255;電壓的計算,乘以0.02,在VB這裡來做!放個TextBox,微調0.019~0.021,跟電錶做驗證,會比較正確喔!
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 上午 10:02:16
謝謝 kenton_lin(Kenton) & qazujm(joe) 指導和幫助,我有一點概念了,我昨天晚上把
kenton_lin(Kenton) 試了一下,發現有問題,所以我早上把 code 的部分再深入研究,不過參考後跑還是有和昨天相同的問題,所以我在幫問題丟上來,請大家在耐心幫我看,真的很不好意思喔!!很謝謝你們的幫忙!!

方法:
韌體部分,我為了簡單化,我先把51的部分,接31H,讓他傳到電腦的ASCII 為"1",所以畫出的波形應該是一條 y =1 的直線,

問題: 一直出現溢位,不知道為啥?
這是偵錯的介面,可以看看問題在哪!!
http://www.wretch.cc/album/show.php?i=pow02162000&b=2&f=1525829737&p=3

程式部分:
我沒有改,我先照他的run!!

作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 上午 10:16:04
我剛看了一下溢位的錯誤,超過型別的數值範圍,如果按照這樣說,是收到的電壓值,

Y = Picture1.ScaleHeight - Val(strA) * sngScaleVolt

超出他的範圍嗎,不太理解?
作者 : qazujm(joe) Visual Basic卓越專家C#優秀好手貼文超過1000則
[ 貼文 1521 | 人氣 2524 | 評價 9070 | 評價/貼文 5.96 | 送出評價 90 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 上午 11:14:57
>我剛看了一下溢位的錯誤,超過型別的數值範圍,如果按照這樣說,是收到的電壓值,
>Y = Picture1.ScaleHeight - Val(strA) * sngScaleVolt
>超出他的範圍嗎,不太理解?

改成第二行或第三行試試,您Timer.Interval = 1000嗎?8051確定是每秒只丟1出來嗎?
MsgBox strA
Y = Picture1.ScaleHeight - CInt(Val(strA) * sngScaleVolt)
Y = Picture1.ScaleHeight - CInt(strA) * 1000
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 12:09:07

>我剛看了一下溢位的錯誤,超過型別的數值範圍,如果按照這樣說,是收到的電壓值,
>
>Y = Picture1.ScaleHeight - Val(strA) * sngScaleVolt
>
>超出他的範圍嗎,不太理解?
>
電壓值strA範圍是0.00~10.00的數值字串,
若不是可否告知 strA的內容
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 12:12:45
可否告知Picture1.ScaleHeight, sngScaleVolt, strA 的內容
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 12:48:02
可能一次讀到多筆資料
可以修改
Const conMaxTime = 3600 * 10 '秒, 每秒讀10次
Timer1.Interval = 100 '500, Timer時間由500ms改為100ms
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 12:51:02
Const conMaxTime = 3600 * 10& '秒, 每秒讀10次, &表示long, 才不會overflow
作者 : simon0216117(賽門)
[ 貼文 35 | 人氣 6293 | 評價 0 | 評價/貼文 0 | 送出評價 2 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 02:11:46
非常感謝你kenton_lin(Kenton)!!
  我剛改了一下參數,終於成功了,謝謝你的協助,不知道要怎麼謝謝你才好呢!!
我還只能感謝在感謝!!
作者 : kenton_lin(Kenton)
[ 貼文 193 | 人氣 5735 | 評價 470 | 評價/貼文 2.44 | 送出評價 3 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/15 下午 11:31:47
X = X + 1 * sngScaleTime '此行需移到if 外, X座標才正確
    If MSComm1.InBufferCount > 0 Then
     '...
    End If
作者 : loulo(小樓)討論區板主 Visual Basic曠世奇才貼文超過1000則人氣指數超過10000點
[ 貼文 1817 | 人氣 11470 | 評價 8620 | 評價/貼文 4.74 | 送出評價 38 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2008/4/16 上午 10:23:28
這個題目看到Kenton的細心解答與賽門的打破沙鍋望到底的態度,確實兩方值得鼓勵鼓勵....

賽門記得要給Kenton一個好的評價喔!自己忍不住也給他一個評價.....
 板主 : 小樓
 > Visual Basic 6.0/VBA - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - Visual Basic 6.0/VBA - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
Visual Basic 6.0/VBA
1 阿戊 10670 
2 小樓 8650 
3 Jones 5270 
4 水瓶天賞 2340 
5 joe 2230 
6 史努比 1950 
7 阿呆紅 1440 
8 tt's 1250 
9 青衫 1150 
10 羅啟章 1020 
Visual Basic 6.0/VBA
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.21875