Robofun 機器人論壇

 找回密碼
 申請會員
搜索
熱搜: 活動 交友 discuz
查看: 6218|回復: 16

用VB寫一個SRF05的應用程式問題

[複製鏈接]
發表於 2008-1-11 13:40:28 | 顯示全部樓層 |閱讀模式
是這樣.如果將SRF05的Echo output接RS232送到電腦去顯示
不知道該怎麼做
直接寫buf=MSComm1.intput
text1.text=buf
顯示出來都是亂碼...請問該如何去讀取Echo的資料?

[ 本帖最後由 cloud0812 於 2008-1-11 13:49 編輯 ]
3.JPG
發表於 2008-1-11 14:01:55 | 顯示全部樓層
看你貼的圖傳回值的長度應該是18BYTE,然後以FF結尾,你要查一下SRF05回傳值的格式,
然後寫一個解譯程式把回傳值變成你要的格式。還有VB的MSCOMM物件的INPUTMODE最好
設成COMINPUTMODEBINARY
 樓主| 發表於 2008-1-11 14:56:52 | 顯示全部樓層
嗯...剛剛發現他送出的訊號是PWM訊號
要測得頻寬去做轉換.看來應該沒辦法直接用VB量
 樓主| 發表於 2008-1-11 18:15:28 | 顯示全部樓層
既然是PWM信號
那如果想用8051去測它的頻寬
該怎麼做呢?感謝
發表於 2008-1-11 18:47:59 | 顯示全部樓層
可以利用中斷或是I/O配合內部計時器做,但是建議用外部電路來數
 樓主| 發表於 2008-1-11 20:57:04 | 顯示全部樓層
何謂外部電路?..
SORRY......真的覺得自己很差
發表於 2008-1-12 08:26:02 | 顯示全部樓層
剛看了一下資料
http://www.robofun.net/forum/viewthread.php?tid=869
真的建議用外部電路來數,做法就是先做一個脈波產生器,產生1us的脈波,然後再做一個16bit的
計數器,而這個計數器就利用SRF05的ECHO來觸發(負緣觸發),一直到ECHO為HIGH時停止觸發
,然後利用單晶片來讀計數器的值,讀值時同時檢查ECHO是否已為HIGH以免讀到錯誤的值.
整個流程大致如上,如果要用單晶片做也可以,但是要注意如果在處理超音波ECHO計數時,有別的
副程式執行或中斷產生,可能會造成讀不到值或是讀到錯誤的值
 樓主| 發表於 2008-1-13 09:02:58 | 顯示全部樓層
如果要在同一顆8051中做到
1.10us輸出給SRF05(驅動SRF05)
2.ECHO計數器(測頻寬)
3.串列埠輸出(傳給VB去讀)
是不可能的嗎?好像每個都要用到一個計數器.而8051只有2個計數器對吧
發表於 2008-1-14 07:11:51 | 顯示全部樓層
可以做得到,因為當在處理ECHO時,RS232是不需要動作的,只是在處理ECHO的過程中,如果有其他中斷或是其他副程式執行,可能會影
響ECHO的判讀,所以如果信號處理電路不熟,那就用一顆2051來專責處理
 樓主| 發表於 2008-1-20 15:10:11 | 顯示全部樓層
總算成功寫好8051了.可以用超級終端機讀到
現在要做的是把8051的值讀到VB上
VB部份該怎麼寫呢?
我是寫下面這裡.但是有錯= =
Private Sub MSComm1_OnComm()
buf = MSComm1.Input
Text1.Text = buf
End Sub
是不是我8051串列埠地方沒寫好
附上我的8051程式

超級終端TEST.txt

901 Bytes, 下載次數: 911

發表於 2008-1-20 16:22:32 | 顯示全部樓層
你所謂的錯是錯在那,要說清楚,不然幫不上忙耶
 樓主| 發表於 2008-1-20 20:03:07 | 顯示全部樓層
其實也不算錯.因為8051會一直傳DATA到電腦所以寫buf = MSComm1.Input
Text1.Text=buf 顯示出來的不是固定一個數
而是一串.例如讀到距離為20時.顯示就是 20 20 20 20 20 20 20

現在有個問題是
我按command1會執行一個動作
按command2會執行另一個動作
如果在執行動作1時發現讀到的值小於20而必須做動作2
那麼該怎麼寫呢?

[ 本帖最後由 cloud0812 於 2008-1-20 20:55 編輯 ]
發表於 2008-1-20 20:56:01 | 顯示全部樓層
在 oncomm事件中加入
  if  text1.text=20 then
   command2_click
  end if
 樓主| 發表於 2008-1-20 23:04:50 | 顯示全部樓層
但是...因為8051工作很快.所以每秒傳出很多次ECHO的值
如果用buf = MSComm1.Input      Text1.Text=buf 這樣的寫法
讀到的值顯示出來會像我的圖這樣
還有..我在每個動作後加buf = MSComm1.Input          Text1.Text=buf
會導致它動作出現問題.甚至當機-.-是不是我VB程式有問題

[ 本帖最後由 cloud0812 於 2008-1-20 23:08 編輯 ]
45.JPG

VB.txt

5.69 KB, 下載次數: 1204

發表於 2008-1-21 08:55:31 | 顯示全部樓層
你所謂的在每個動作都加buf = MSComm1.Input          Text1.Text=buf 是指在每個按鈕的事件中
都加嗎,如果是的話那就不對了,應該在on_comm事件中處理就好,如果不是的話,你把你的
on_comm事件處理程式跟一兩個按鈕事件程式碼貼上來看看問題在哪
 樓主| 發表於 2008-1-21 11:26:05 | 顯示全部樓層
找到問題了.是因為8051傳輸太快.導致於VB無法正常運作
感謝大大解惑
 樓主| 發表於 2008-1-21 12:53:58 | 顯示全部樓層
我知道問題所在了
當8051傳送一個資料給VB時.他會將它存起來
然後當程式執行buf= MSComm1.Input時
VB則會將剛剛所存的資料一次傳給buf
那就是說當我8051程式傳輸資料(例如傳一個數字20)在VB未讀取出去之前又傳輸一次(20)的話
在執行buf= MSComm1.Input時.buf讀出的值將會是 20 20

但是我要做的是只讀一次也就是讀出第1次的20.那麼該怎麼做呢?

[ 本帖最後由 cloud0812 於 2008-1-21 16:50 編輯 ]

VB.txt

5.71 KB, 下載次數: 1015

您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

小黑屋|手機版|Archiver|機器人論壇 from 2005.07

GMT+8, 2024-4-19 08:48 , Processed in 0.260243 second(s), 9 queries , Apc On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表