1
中華大學資訊工程學系
100 學年度專題製作期末報告
ZigBee 定位與應用
組員:
B09702014 王志偉(組長) B09702149 陳暘
B09702071 林柏翰
指導老師: 俞征武 教授
中華民國 100 年 6 月 25 日
2
目 錄
第一章 簡介
1-1 背景 ... 3
1-2 目的 ... 3
第二章 使用的硬體元件
2-1 硬體配備...42-2 軟體環境...10
第三章 硬體設計及程式的邏輯架構
3-1 硬體組裝...123-2 功能設計敘述...12
3-3 程式架構...13
第四章 主要成果
4-1 定位座標 164-2 連結
C#
介面打出座標點 17第五章 遭遇困難
5-1ZigBee
之間無法傳送與接收資料 185-2
ZigBee
傳送資料時發生嚴重碰撞 185-3 三角定位演算法 19
第六章 未來發展與結語
6-1 未來發展... ...206-2 結語與心得... ....20
其他
0-1 程式碼... ...210-2 時間分配表... ...36
0-3 組員分工... ...38
0-4 參考資料... ...39
3 第一章 簡介
1-1 背景
Zigbee 是一種短距離的通訊技術,理想中的傳輸距離是 100 公 尺,省電是它的最大訴求,一個 zigbee 裝置的電池可以使用數月 到數年之久。而 zigbee 的應用定位也比較簡單。
鑒於無線網絡部署的靈活性,ZigBee 無線定位非常適合在布線條 件不具備的應用場合(如:剛剛興建的建築工地、室外貨場等)。
1-2 目的
本次的專題的主要的目的是以 ZigBee 取得 RSSI 的值並用 RSSI 取
得的值轉換成距離值,再用三角定位演算法來算出座標,藉此來
達到定位的功能。
4 第二章 使用的硬體元件
2-1 硬體配備
我們藉由無線感測自走車的開發實驗電路板來當基礎。並配備上 ZigBee 感應器來感測母機與子機的接收與傳送。
5
(1.) 開發實驗電路板
所有的組件都是以這塊電路板為基礎所接上去的。
開發實驗電路板
此實驗電路板有許多種版本,但是每個版本其功能大同小異,大
多只差在下列幾項,BASIC Stamp 晶片是否預先焊接上去、電源供應
器插頭(一般電池或方型電池)、與電腦連接的傳輸線插頭不同(傳統
多針頭式或小型 USB 兩種版本),但是整體上的功能都是一樣的,當
然在 BASIC Stamp 晶片的部分還有分幾種後面會在介紹,在此就不多
贅述。
6
(2.) BASIC Stamp 2 module
目前最廣泛受歡迎使用的晶片, 可用在工業控制, 教學, 機器 人控制; 舉凡通訊, 影像, I/O, 運動控制等等,所有程式碼都存在 這邊,接收到訊號後也是在這邊判斷。
BASIC Stamp 2 module
其包含了控制、算術邏輯、記憶三大單元,只是整體效能上與 CPU 仍有一段落差可說是 CPU 的簡化再簡化,所以在程式撰寫上往往 不免受限於硬體的極限影響。
此外先前提及 BASIC Stamp 晶片目前又可分為下列幾種,在此
就做一下簡介。依外型顏色可區分成紅色、藍色、黃色、綠色、白色
以此五種顏色為首下面又可分出不同的型號,不同的晶片自然有不同
的功能,而目前教學上常用的則是綠色 BASIC Stamp 2 module。
7
(3.) Zigbee 又稱 XBee
XBee 簡介
一種無線感測網路器,在教學上很普及 2.4GHz XBee 模組,而 且平價、低功率。這個模組是利用簡單的 Serial command (串列傳 輸)來執行在 802.15.4 上的 Zigbee 通訊協定。可支援任何微處理器,
電腦與系統間的通訊,只要它們具有 serial port。不論是點對點 ( point-to-point)或是多點間 multi-point networks,都可以支援。
此通訊裝置在與電路板連接時,還 需要一樣轉接板,稱為 ZigBee (XBee)對 BASIC Stamp 系列連接板,此轉接板目前 又可分為兩種紅色及綠色,而我們專題用 到的也是目前常用的綠色的版本。
8
上圖為 Zigbee 插上轉接板後再與教學板的連接範例圖,圖中紅色及 黑色線是傳導電流正負極電源線,剩餘的黃色及藍色則是傳送資料的 資料線。
在教學板上的白色部分稱為麵包板,而麵包板周圍的黑色插槽各 有其編號,每個編號的一個孔稱為一個 pin 角(腳)。上排黑色插槽編 號 Vdd、Vin 及 Vss 為供應電流正負極的部分,左排黑色插槽編號 P0~P15 則是資料線,連結著 BASIC Stamp 晶片,只需要在程式中建 立位子(P0~P15 任何選一個) BASIC Stamp 晶片就會使該 pin 角通電 藉此控制麵包板上的元件。
在 Zigbee 及轉接板上每個針狀插頭也各有編號,Vin 及 Vss 是
9
負責電流正負極通電,Rx 和 Tx 是訊號接收與送出,最後還有 RTS 及 SLP 也有其各自的功能,但因為我們專題未使用到在此就不多介紹。
(4.) 電源供應
提供所有實驗電路板上所有設施的全部能量,電壓不足可能會判 斷錯誤,或停止運行。
9V-方形電池
四顆串接電池
10
在我們的專題中發現,電源供應器電壓的強弱會明顯影響 Zigbee 的 訊號傳送,因此在電池的選用上建議選用好一點的電池最好是 1.5V 的。因此若在實驗中,發現硬體沒問題但是訊號就是沒接收或傳送,
不妨檢察一下電力是不是不夠。
2-2 軟體環境
BASIC Stamp
此是前面所述的硬體 BASIC Stamp 的開發環境。
11
開始撰寫的畫面,有點類似 C 語言但是相較之下此語言較低階一點。
Microsoft Visual C# 2010
Microsoft Visual C# 2010 用來編寫 C 程式語言的工具,本次使用
它來製作【連結介面】,與【電腦與 ZigBee 溝通】的程式。
12 第三章 硬體設計及程式的邏輯架構
3-1 硬體組裝
母機端(由欲定位者攜) 子機端(在場地的周圍設置帶)
3-2 功能設計敘述將子機端設置在場的的周圍利用三角定位的方法來定位
13
我們的設備主要分為兩端,如上圖所示。分別為母機端和子機端,子 機端設置在場地的周圍,母機端則由各個欲定位者個別攜帶。其功能
目的如下:
每個母機端在子機端上都有一個專屬的訊號燈,子機端會不時的偵測 各個母機端的訊號,只要有偵測到,各子機專屬的信號燈會抱持閃 爍,同時子機端也會不停發送訊號給母機端讓母機端偵測,因此,只 要母機還在偵測距離內就不斷的定位出母機的位置。
3-3 程式架構
訊號偵測傳輸概念圖
母機
子 機
子機 子機
14
3-3-1:程式架構概念
上圖是我們建立的定位訊號傳輸概念,我們所使用的定位方法是 三角定位,上圖中間的長方形所包含的範圍代表場地的範圍,在場地 的四周設置定位器(子機)可以看出不論母機移動到場地的何處都會 在三台子機的偵測範圍內,所以不管移動至場地的何處都可以被定位 系統所定位到。
3-3-2:程式架構流程
Step1:三台座標子機分別傳送 RSSI 值給母機 Step2:母機接收從三台子機傳送的訊號後 Step3:經過三角定位演算法
Step4:算出現在座標點
Step5:把資料傳到並連結到介面上打一個點 Step6:再回到 Step1
3-3-3:三角定位演算法
假設三個基地台 BS1、BS2 及 BS3 的參考座標分別為(x1 , y1 )、 (x
2, y2 )與(x3 , y 3),MT 的座標為(x, y)距離三個基地台分別是 r1 、
r 2 與 r 3,則各基地台的圓形方程式可表示為
15
16 第四章 主要成果
4-1 定位座標
透過 ZigBee 傳輸的 RSSI 值來定位座標點
17
4-2 連結 C#介面打出座標點
使用 C#介面連結 USB 到麵包板上將板子上送出的座標位置印在
畫面上
18 第五章 遭遇困難
5-1 ZigBee 之間無法傳送與接收資料
後來發現原來 ZigBee 有頻段設定的問題如果 頻段不同就互相收不到訊號,舉例來說:我有 3 個 ZigBee 其中第一個 ZigBee 的頻段是 0、第
二個 ZigBee 的頻段是 1、第三個 ZigBee 的頻段也是 1 ,那麼 第一個 ZigBee 就和第二三個 ZigBee 無發互相傳送資料但是第 二個和第三個 ZigBee 就可以互相傳送資料。
解決辦法
:
後來我們上網找得了解決辦法就是用右上角那塊紅色版子連接 到電腦,然後用 X-CUT 這個軟體進到 ZigBee 內部去做設定。
5-2 ZigBee 傳送資料時發生嚴重碰撞
三台子機傳送資料的時間太相近太頻繁了,導致傳送資料時發 生嚴重碰撞導致接收不到資料
解決辦法:
所以我們 Random 他的送出的時間讓他送封包的時間錯開
19
5-3 三角定位演算法
這個演算法他的難處在於他有一個 3*2 的反矩陣但是上網找了 又找發現反矩陣只有方陣才有這下完全卡住了
解決辦法:
最後我們用了 MATLAB 這個程是幫我們算出了這個矩陣並順利
的完成了三角定位程式
20 第六章 未來發展與結語
6-1 未來發展
礦井下人員定位 — 利用區域定位技術,可以隨時了解礦工的 工作位置和相關信息。。
醫院中被看護對象的定位 — 利用區域定位技術,可以隨時了 解被看護對象活動區域或貴重醫療設備的放置場所。被看護對 象也可以通過隨身裝置,向醫護人員發出求救信號。
消防人員定位 — 利用區域定位技術,可以動態掌握進入火災 現場消防隊員的活動範圍,為現場指揮提供有效的資料。
建築工地管理 — 利用區域定位技術,可以了解施工人員的考 勤及活動狀況。
當然上面所列的想法不過只是冰山一角,定位系統能應用的範圍相當 廣泛,在未來一定能有更多的應用能使人們的生活更便利更有品質。
6-2 結語與心得
在這一年的時間內,雖然過程中碰到一次又一次的問題使得進度好幾
次停滯不前,經過一番努力與幾位好心學長的幫忙之下,我們終於完
成了這一次的專題,經過這次專題我們學習到了,挑戰了一些沒有學
過的東西,自己去研究並解決問題,並了解到充分團隊合作的重要
性。
21
其他
0.1 程式碼 母機_程式碼:
' {$STAMP BS2}
' {$PBASIC 2.5}
' **************************************
' * Get_RSSI.bs2 * ' * Illustrates accepting a Byte * ' * received as a character * ' * and reads/displays RSSI dBm * ' **************************************
myAddr CON $A2 ' Node Address(*自己的位置*) DestAddr CON $A2 ' Destination address
Baud CON 84 ' Baud rate, 9600, 8-N-1, non-inverted, on BS2.
RX PIN 0 ' Receive Pin TX PIN 2 ' Transmit Pin RTS PIN 6 ' Flow control Pin
RFin VAR Byte dBm VAR Byte x VAR Byte
y VAR Byte r1 VAR Byte r2 VAR Byte r3 VAR Byte c1 VAR Byte c2 VAR Byte c3 VAR Byte HIGH TX
'DEBUG CLS, "Configuring XBee..."
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["+++"] ' Enter command mode
22
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["ATNI BS2 Test Node",CR, ' Set description
"ATMY ", HEX myAddr,CR, ' Set node address
"ATDL ", HEX DestAddr,CR, ' Set destination node address "ATD6 1",CR, ' Use RTS for flow control "ATGT 3",CR, ' Reduce Gaurd Time
"ATCN"] ' Exit command mode
PAUSE 1000
GOSUB WaitOK ' Accept OK data 'DEBUG "Configuration Complete!",CR
DO ' Accept and view a character SERIN RX\RTS,Baud,1000,Timeout,[RFin]
'DEBUG RFin GOSUB GetRSSI Timeout:
LOOP
GetRSSI: ' Read RSSI data PAUSE 20 ' Guard time SEROUT TX, Baud, ["+++"] ' Command mode PAUSE 2
SEROUT TX, Baud, ["ATDB",CR] ' Request level SERIN RX\RTS, Baud,1000,Timeout2,[HEX dBm] ' Accept data 'DEBUG " dbm: -", DEC dBm ' Display data
IF (RFin = 49)THEN IF(dBm = 24) OR (dBm = 23 ) OR (dBm = 25) THEN x = 0
y = 0
'DEBUG " 座標"
DEBUG DEC x ," ",DEC y ENDIF
IF (RFin = 50)THEN IF(dBm = 24) OR (dBm = 23 ) OR (dBm = 25) THEN x = 50
y = 0
'DEBUG " 座標"
DEBUG DEC x ," ",DEC y
23
ENDIF
IF (RFin = 51)THEN IF(dBm = 24) OR (dBm = 23 ) OR (dBm = 25) THEN x = 20
y = 50
'DEBUG " 座標"
DEBUG DEC x ," ",DEC y ENDIF
IF(RFin = 49) THEN IF(dBm = 32)THEN r1 = 18
ELSEIF(dBm < 32)THEN r1 = 18
ELSEIF(dBm = 33)THEN r1 = 19
ELSEIF(dBm = 34)THEN r1 = 20
ELSEIF(dBm = 35)THEN r1 = 21
ELSEIF(dBm = 36)THEN r1 = 22
ENDIF
IF(RFin = 49)THEN IF(dBm = 37)THEN r1 = 38
ELSEIF(dBm = 38)THEN r1 = 39
ELSEIF(dBm = 39)THEN r1 = 40
ELSEIF(dBm = 40)THEN r1 = 41
ELSEIF(dBm = 41)THEN r1 = 42
ENDIF
IF(RFin = 49)THEN IF(dBm = 41)THEN r1 = 58
ELSEIF(dBm = 42)THEN r1 = 59
ELSEIF(dBm = 43)THEN r1 = 60
24
ELSEIF(dBm = 44)THEN r1 = 61
ELSEIF(dBm = 45)THEN r1 = 62
ENDIF
IF(RFin = 49)THEN IF(dBm = 46)THEN r1 = 78
ELSEIF(dBm = 47)THEN r1 = 79
ELSEIF(dBm = 48)THEN r1 = 80
ELSEIF(dBm = 49)THEN r1 = 81
ELSEIF(dBm = 50)THEN r1 = 82
ENDIF
IF(RFin = 49)THEN IF(dBm = 51)THEN r1 = 98
ELSEIF(dBm = 52)THEN r1 = 99
ELSEIF(dBm = 53)THEN r1 = 100
ELSEIF(dBm = 54)THEN r1 = 101
ELSEIF(dBm = 55)THEN r1 = 102
ELSEIF(dBm > 56)THEN r1 = 103
ENDIF
IF(RFin = 50) THEN IF(dBm = 32)THEN r2 = 18
ELSEIF(dBm < 32)THEN r2 = 18
ELSEIF(dBm = 33)THEN r2 = 19
ELSEIF(dBm = 34)THEN r2 = 20
25
ELSEIF(dBm = 35)THEN r2 = 21
ELSEIF(dBm = 36)THEN r2 = 22
ENDIF
IF(RFin = 50)THEN IF(dBm = 37)THEN r2 = 38
ELSEIF(dBm = 38)THEN r2 = 39
ELSEIF(dBm = 39)THEN r2 = 40
ELSEIF(dBm = 40)THEN r2 = 41
ELSEIF(dBm = 41)THEN r2 = 42
ENDIF
IF(RFin = 50)THEN IF(dBm = 41)THEN r2 = 58
ELSEIF(dBm = 42)THEN r2 = 59
ELSEIF(dBm = 43)THEN r2 = 60
ELSEIF(dBm = 44)THEN r2 = 61
ELSEIF(dBm = 45)THEN r2 = 62
ENDIF
IF(RFin = 50)THEN IF(dBm = 46)THEN r2 = 78
ELSEIF(dBm = 47)THEN r2 = 79
ELSEIF(dBm = 48)THEN r2 = 80
ELSEIF(dBm = 49)THEN r2 = 81
ELSEIF(dBm = 50)THEN r2 = 82
ENDIF
26
IF(RFin = 50)THEN IF(dBm = 51)THEN r2 = 98
ELSEIF(dBm = 52)THEN r2 = 99
ELSEIF(dBm = 53)THEN r2 = 100
ELSEIF(dBm = 54)THEN r2 = 101
ELSEIF(dBm = 55)THEN r2 = 102
ELSEIF(dBm > 56)THEN r2 = 103
ENDIF
IF(RFin = 51) THEN IF(dBm = 32)THEN r3 = 18
ELSEIF(dBm < 32)THEN r3 = 18
ELSEIF(dBm = 33)THEN r3 = 19
ELSEIF(dBm = 34)THEN r3 = 20
ELSEIF(dBm = 35)THEN r3 = 21
ELSEIF(dBm = 36)THEN r3 = 22
ENDIF
IF(RFin = 51)THEN IF(dBm = 37)THEN r3 = 38
ELSEIF(dBm = 38)THEN r3 = 39
ELSEIF(dBm = 39)THEN r3 = 40
ELSEIF(dBm = 40)THEN r3 = 41
ELSEIF(dBm = 41)THEN r3 = 42
ENDIF
27
IF(RFin = 51)THEN IF(dBm = 41)THEN r3 = 58
ELSEIF(dBm = 42)THEN r3 = 59
ELSEIF(dBm = 43)THEN r3 = 60
ELSEIF(dBm = 44)THEN r3 = 61
ELSEIF(dBm = 45)THEN r3 = 62
ENDIF
IF(RFin = 51)THEN IF(dBm = 46)THEN r3 = 78
ELSEIF(dBm = 47)THEN r3 = 79
ELSEIF(dBm = 48)THEN r3 = 80
ELSEIF(dBm = 49)THEN r3 = 81
ELSEIF(dBm = 50)THEN r3 = 82
ENDIF
IF(RFin = 51)THEN IF(dBm = 51)THEN r3 = 98
ELSEIF(dBm = 52)THEN r3 = 99
ELSEIF(dBm = 53)THEN r3 = 100
ELSEIF(dBm = 54)THEN r3 = 101
ELSEIF(dBm = 55)THEN r3 = 102
ELSEIF(dBm > 56)THEN r3 = 103
ENDIF
GOTO out in:
28
Timeout2:
SEROUT TX, Baud,["ATCN",CR] ' Exit command mode GOSUB WaitOK ' Accept OK from XBee 'DEBUG CR
RETURN
WaitOK:
SERIN RX\RTS, Baud, 100,Timeout3, [RFin] ' Accept OK data GOTO WaitOK
Timeout3:
RETURN
out:
c1 = r1*r1-r2*r2+25 c2 = r1*r1-r3*r3+29 c3 = r2*r2-r3*r3+4
IF(r1 > 0) AND (r2 > 0) AND (r3 > 0)THEN x = (c1*667 + c2*333 - c3*333)/10000 y = (c1*67 + c2*533 + c3*467)/10000 x = x * 10
y = y * 10 'DEBUG " 座標"
DEBUG DEC x ," ",DEC y dBm = 0
r1 = 0 r2 = 0 r3 = 0 PAUSE 500 ENDIF GOTO in
29
子機 1_程式碼:
' {$STAMP BS2}
' {$PBASIC 2.5}
myAddr CON $A8 ' Node Address (*自己的位置*)
DestAddr CON $A2 ' Destination address(目標位置)(*要設定*) result VAR Word
rand VAR Word
Baud CON 84 ' Baud rate, 9600, 8-N-1, non-inverted, on BS2.
RX PIN 0 ' Receive Pin TX PIN 2 ' Transmit Pin RTS PIN 6 ' Flow control Pin
X VAR Byte HIGH TX
DEBUG CLS, "Configuring XBee..."
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["+++"] ' Enter command mode
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["ATNI BS2 Test Node",CR, ' Set description
"ATMY ", HEX myAddr,CR, ' Set node address
"ATDL ", HEX DestAddr,CR, ' Set destination node address "ATD6 1",CR, ' Use RTS for flow control "ATCN",CR] ' Exit command mode
PAUSE 1000
DEBUG "Ready!",CR X = 1
result = 11000 DO
RANDOM result PAUSE 800
rand = result/100
SEROUT TX,84,[DEC X,CR,CR]
PAUSE rand LOOP
30
子機 2_程式碼:
' {$STAMP BS2}
' {$PBASIC 2.5}
myAddr CON $A9 ' Node Address (*自己的位置*)
DestAddr CON $A2 ' Destination address(目標位置)(*要設定*) result VAR Word
rand VAR Word
Baud CON 84 ' Baud rate, 9600, 8-N-1, non-inverted, on BS2.
RX PIN 0 ' Receive Pin TX PIN 2 ' Transmit Pin RTS PIN 6 ' Flow control Pin
X VAR Byte HIGH TX
DEBUG CLS, "Configuring XBee..."
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["+++"] ' Enter command mode
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["ATNI BS2 Test Node",CR, ' Set description
"ATMY ", HEX myAddr,CR, ' Set node address
"ATDL ", HEX DestAddr,CR, ' Set destination node address "ATD6 1",CR, ' Use RTS for flow control "ATCN",CR] ' Exit command mode
PAUSE 1000
DEBUG "Ready!",CR X = 2
result = 33000 DO
RANDOM result PAUSE 900
rand = result/100
SEROUT TX,84,[DEC X,CR,CR]
PAUSE rand LOOP
31
子機 3_程式碼:
' {$STAMP BS2}
' {$PBASIC 2.5}
myAddr CON $A7 ' Node Address (*自己的位置*)
DestAddr CON $A2 ' Destination address(目標位置)(*要設定*) result VAR Word
rand VAR Word
Baud CON 84 ' Baud rate, 9600, 8-N-1, non-inverted, on BS2.
RX PIN 0 ' Receive Pin TX PIN 2 ' Transmit Pin RTS PIN 6 ' Flow control Pin
X VAR Byte HIGH TX
DEBUG CLS, "Configuring XBee..."
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["+++"] ' Enter command mode
PAUSE 2000 ' Guard time for command sequence SEROUT TX,Baud,["ATNI BS2 Test Node",CR, ' Set description
"ATMY ", HEX myAddr,CR, ' Set node address
"ATDL ", HEX DestAddr,CR, ' Set destination node address "ATD6 1",CR, ' Use RTS for flow control "ATCN",CR] ' Exit command mode
PAUSE 1000
DEBUG "Ready!",CR X = 3
result = 64000 DO
RANDOM result PAUSE 1000
rand = result/100
SEROUT TX,84,[DEC X,CR,CR]
PAUSE rand LOOP
32
C#介面程式碼
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO.Ports;
namespace poj {
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
//serialPort1.Open();
}
private delegate void setTextCallback(string text);
private void pictureBox1_Click(object sender, EventArgs e) {
}
private void button1_Click(object sender, EventArgs e) {
if (serialPort1.IsOpen) {
serialPort1.Close();
} else
33
{ serialPort1.PortName = comboBox1.Text;
serialPort1.Open();
}
/*int x = 0 ,y = 0 ; Graphics g;
char[] str = new char[100];
//while(true) //{
//int len = serialPort1.BytesToRead;
int len = serialPort1.ReadBufferSize;
serialPort1.Read(str,0,len);
//g = pictureBox1.CreateGraphics();
//g.FillEllipse(Brushes.Red,x,y,10, 10);
*/
}
private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
{
try {
//StringBuilder str = new StringBuilder();
System.Threading.Thread.Sleep(50);
int len = serialPort1.BytesToRead;
//Console.Write(len.ToString() + ", ");
char[] tmp = new char[len];
serialPort1.Read(tmp, 0, len);
//Console.WriteLine(tmp);
this.setText(new String(tmp));
}
catch (Exception f) {
this.textBox1.Text += "error" + "\r\n";
}
34
//textBox1.Text += serialPort1.ReadExisting();
//this.setText(serialPort1.ReadExisting());
//d.Invoke(new String(tmp));
//this.setText()
}
private void setText(string text) {
Graphics g;
if (this.textBox1.InvokeRequired) {
setTextCallback d = new setTextCallback(setText);
this.Invoke(d, new string[] { text });
} else {
string[] loc = text.Split(' ');
int x = Convert.ToInt32(loc[0]);
int y = Convert.ToInt32(loc[1]);
try {
g = pictureBox1.CreateGraphics();
g.FillEllipse(Brushes.Red,x,y,10,10);
textBox1.Text = "";
this.textBox1.Text += x.ToString() + ":" + y.ToString() + "\r\n";
}
catch (Exception e) {
this.textBox1.Text += "error" + "\r\n";
}
//this.textBox1.Text += (string)text +"\r\n";
} }
private void button2_Click(object sender, EventArgs e) {
this.Refresh();
35
textBox1.Text ="";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e) {
//
this.comboBox1.Items.AddRange(System.IO.Ports.SerialPort.GetPortNames());
}
private void Form1_Load(object sender, EventArgs e) {
string[] serialPorts = SerialPort.GetPortNames();
foreach (string serialPort in serialPorts) {
comboBox1.Items.Add(serialPort);
if (comboBox1.Items.Count > 0) {
comboBox1.SelectedIndex = 0;
} } }
} }
36
0.2時間分配表
月份
工作
3 月
4 月
5 月
6 月
9 月
9 月
10 月
11 月
12 月
1 月 備 註
擬定專題 ★ 硬體組裝 ★
程式撰寫 ★ ★ ★ ★ ★ ★
測試偵錯 ★ ★ ★
完成專題 ★
完成度(%) 5 20 25 35 50 75 85 90 95 100
37
月份
工作
3 月
4 月
5 月
6 月
9 月
9 月
10 月
11 月
12 月
1 月
備 註
擬定專題 ★ 硬體組裝 ★
程式撰寫 ★ ★ ★ ★ ★ ★
測試偵錯 ★ ★ ★ 完成專題 ★ 完 成 度
(%)
5 20 25 35 50 75 85 90 95 10
0
38
0.3 組員分工
王志偉 陳暘 林柏翰
硬體組裝 ○ ○
程式撰寫 ○ ○
測試偵錯 ○ ○
書面製作 ○
海報製作 ○
報告統整 ○ ○
39
0.4 參考資料