嵌入式講稿(第7課)_第1頁
嵌入式講稿(第7課)_第2頁
嵌入式講稿(第7課)_第3頁
嵌入式講稿(第7課)_第4頁
嵌入式講稿(第7課)_第5頁
已閱讀5頁,還剩10頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、第7課講稿(Bluetooth組網(wǎng)實驗)一、 第6課遺留問題二、 RFID串口協(xié)議實驗1. 實驗目的2. 實驗設備3. 實驗內容4. 實驗原理5. 實驗步驟6. 思考題趙龑驤一、 第6課遺留問題【問題描述】第6課的代碼存在一個Bug:充值或者支付時,卡內余額不會同步改變。【原因】串口協(xié)議的數(shù)據(jù)格式有問題,正確的數(shù)據(jù)格式如下:充值:EE CC FE NO 01 ID0 ID1 ID2 ID3 XX XX XX XX FF支付:EE CC FE NO 02 ID0 ID1 ID2 ID3 XX XX XX XX FF注:NO默認為0x01,一幀數(shù)據(jù)定長14個字節(jié)【解決方案】需修改部分代碼:1. 變

2、量定義public static byte cmdrecharge = new byte14; /充值,一幀數(shù)據(jù)14個字節(jié)public static byte cmdpay = new byte14; /支付,一幀數(shù)據(jù)14個字節(jié)2. ButtonClickListener類:充值按鍵監(jiān)聽(v=add_bt)時addbuf3 = (byte) (rechargemoney >> 24) & (0x00); / 充值金額轉換成二進制addbuf2 = (byte) (rechargemoney >> 16) & (0xff00);addbuf1 = (byt

3、e) (rechargemoney >> 8) & (0xffff00);addbuf0 = (byte) (rechargemoney >> 0) & (0xffffff00);cmdrecharge0 = (byte)0xEE;cmdrecharge1 = (byte)0xCC;cmdrecharge2 = (byte)0xFE;cmdrecharge3 = (byte)0x01;cmdrecharge4 = (byte) 0x01; /充值cmdrecharge5 = cardinfo1;cmdrecharge6 = cardinfo2;cmdre

4、charge7 = cardinfo3;cmdrecharge8 = cardinfo4;cmdrecharge9 = addbuf3;cmdrecharge10 = addbuf2;cmdrecharge11 = addbuf1;cmdrecharge12 = addbuf0;cmdrecharge13 = (byte) 0xFF;3. ButtonClickListener類:充值按鍵監(jiān)聽(v=pay_bt)時paybuf3 = (byte) (paymoney >> 24) & (0x00);paybuf2 = (byte) (paymoney >> 16

5、) & (0xff00);paybuf1 = (byte) (paymoney >> 8) & (0xffff00);paybuf0 = (byte) (paymoney >> 0) & (0xffffff00);cmdpay0 = (byte)0xEE;cmdpay1 = (byte)0xCC;cmdpay2 = (byte)0xFE;cmdpay3 = (byte)0x01;cmdpay4 = (byte) 0x02; /支付cmdpay5 = cardinfo1;cmdpay6 = cardinfo2;cmdpay7 = cardinfo3

6、;cmdpay8 = cardinfo4;cmdpay9 = paybuf3;cmdpay10 = paybuf2;cmdpay11 = paybuf1;cmdpay12 = paybuf0;cmdpay13 = (byte) 0xff;二、 RFID串口協(xié)議實驗實驗八. Bluetooth組網(wǎng)實驗1. 實驗目的¨ 學習Bluetooth無線傳感網(wǎng)技術¨ 掌握移動互聯(lián)平臺底板模塊間的串口配置方法¨ 掌握CBT-SuperIOT實驗平臺上傳感器與處理器通過串口通信的協(xié)議¨ 掌握Android串口通信中間件的使用方法¨ 掌握Handler的使用機制

7、,實現(xiàn)子線程與UI線程的通信2. 實驗設備¨ 硬件:全功能物聯(lián)網(wǎng)實驗平臺,PC機¨ 軟件:Eclipse集成開發(fā)環(huán)境3. 實驗內容¨ 分析藍牙通信協(xié)議¨ 設計布局應用程序界面¨ 分析串口數(shù)據(jù)通信流程,編寫應用程序代碼¨ 編譯并測試運行,查看演示效果4. 實驗原理4.1 藍牙通信協(xié)議協(xié)議格式及說明見光盤doc目錄下的CBT 模塊通訊協(xié)議V2.5.pdf文檔中的藍牙通信協(xié)議部分。一幀數(shù)據(jù)占46個字節(jié)。4.2 藍牙4.0通信原理簡介藍牙4.0是2012年最新藍牙版本,是3.0的升級版本;較3.0版本更省電、成本低、3毫秒低延遲、超長有效連接

8、距離、AES-128加密等;通常用在藍牙耳機、藍牙音箱等設備上。本實驗中所使用的是兩個藍牙4.0模塊,一個為主設備,另一個為從設備。通信流程為:Ø 從設備上的傳感器信息實時上報給藍牙從設備。Ø 主設備上電后會自動上報包含其網(wǎng)絡地址的一幀數(shù)據(jù)。Ø 主設備需收到一幀包含“搜索”命令格式的數(shù)據(jù)包后才可以掃描周圍工作中的藍牙從設備。Ø 當掃描到藍牙從設備后會將該從設備的網(wǎng)絡地址封裝到主設備的一幀數(shù)據(jù)包中發(fā)送出去。Ø 當主設備收到一幀包含“連接”命令及要連接的從設備地址的數(shù)據(jù)包后,從設備會實時上報包含傳感器信息的數(shù)據(jù)幀。Ø 若從設備傳感器可控,

9、向主設備發(fā)送一幀包含“控制”命令的數(shù)據(jù)幀即可控制相應傳感器。Ø 當主設備收到一幀包含“斷開”命令及要斷開的從設備地址的數(shù)據(jù)包后,會停止上報從設備數(shù)據(jù)。5. 實驗步驟¨ 藍牙4.0模塊串口配置¨ 在Eclipse下新建一項目工程BluetoothDemo¨ 設計界面布局文件activity_main.xml¨ 編寫主程序¨ 調試并編譯運行5.1 藍牙4.0模塊串口配置給實驗箱上的BlueTooth主機模塊上電,并將撥碼開關撥到3上。5.2 在Eclipse下新建一項目工程BluetoothDemo所用到的圖片資源項目的框架如圖1所示:這

10、個包為中間層提供的API接口類,供上層調用。包名必須為com.cbtService.AndroidSDK (與中間層相對應),否則相應的方法如read()會無法調用。工具類讀線程主界面數(shù)據(jù)處理類圖1 程序框架5.3 設計界面布局文件activity_main.xml¨ 布局效果如圖2所示:圖2 程序布局界面¨ 布局框架如圖3所示。整體采用的是相對布局RelativeLayout。圖3 布局框架¨ 源代碼可參考源碼包中BluetoothDemoreslayoutactivity_main.xml文件。5.4 編寫主程序代碼l 首先新建一中間層提供的串口API接口類。

11、這里的Package必須填“com.cbtService.AndroidSDK”,Name必須填“HardwareControler”,其它默認(Package與Name已經(jīng)和接口函數(shù)庫匹配了,所以要一致)。在HardwareControler.java中添加如下代碼:package com.cbtService.AndroidSDK;public class HardwareControler static System.loadLibrary("serialtest_runtime"); public static native boolean _init();/* S

12、erial Port */static public native int openSerialPort( String devName, long baud, int dataBits, int stopBits );/* 通用接口 */static public native int write(int fd, byte data);static public native int read(int fd, byte buf, int len);static public native int select(int fd,int sec,int usec); static public n

13、ative int close(int fd); 之后就可以通過提供的以上接口函數(shù)進行相應的功能代碼編寫了。l 初始化串口和組件元素在MainActivity主界面的onCreate方法中添加如下代碼:super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);HardwareControler._init();serial_fd = HardwareControler.openSerialPort("/dev/s3c2410_serial3",9600, 8, 1); /串口初始化in

14、it(); /初始化組件元素的方法 mThread = new BluetoothThread(); /開啟一個線程循環(huán)從串口讀數(shù)據(jù)BluetoothThread.setHandler(mHandler);/并調用Handler在界面中更新數(shù)據(jù)狀態(tài) l 注:藍牙串口波特率為:9600l BluetoothThread獲取數(shù)據(jù)線程關鍵代碼分析:(藍牙串口通信協(xié)議見CBT 模塊通訊協(xié)議V2.5.pdf)Overridepublic void run() / TODO Auto-generated method stubwhile (isReading) ret = HardwareControle

15、r.select(mSerialfd, 4, 5);if (ret = 1) HardwareControler.read(mSerialfd, checkbuf, 1);if (checkbuf0 & 0xFF) = 0xEE) HardwareControler.read(mSerialfd, checkbuf, 1);if (checkbuf0 & 0xFF) = 0xCC) HardwareControler.read(mSerialfd, buf1, 44);if (buf10 & 0xFF) = 0x04&& (buf143 & 0x

16、FF) = 0xFF) / Bluetoothdata = new byte46;data0 = (byte) 0xEE;data1 = (byte) 0xCC;for (int i = 0; i < buf1.length; i+) datai + 2 = buf1i;mData = new NodeDesp();mData = NodeDespProcess.getNodeMessage(data);Message msg = Message.obtain();if (data29 = 0) /判斷主從節(jié)點System.out.println("節(jié)點類型:主節(jié)點Blueto

17、oth");switch (data31 & 0xFF) case 0: / 自動上報Bundle b = new Bundle();byte nodeData;String majoraddr = ""majoraddr = mData.getIeeeBlueAddr();nodeData = mData.getBytesData();b.putString("majorAddr", majoraddr);b.putByteArray("nodeData", nodeData);msg.what = Constan

18、ts.WHAT_BLUETOOTH_ADDR;msg.setData(b);if (mHandler != null) mHandler.sendMessage(msg);break;case 1: / 掃描從節(jié)點System.out.println("掃描到從節(jié)點");list_Bluetooth = NodeDespProcess.getSpNodeMessage(data,list_Bluetooth);splistItem = NodeDespProcess.getSpList(data,splistItem);if (NodeDespProcess.isBList

19、Changed| NodeDespProcess.isSpListChanged) if (mHandler != null) mHandler.sendEmptyMessage(Constants.WHAT_BLUETOOTH_SCAN_UPDATE);if (mHandler != null) mHandler.sendEmptyMessage(Constants.WHAT_BLUETOOTH_SCAN2_UPDATE);break;default:break; else if (data29 = 1) Bundle b = new Bundle();byte nodeData;Syste

20、m.out.println("節(jié)點類型:從節(jié)點連接后時時上報Bluetooth"+ mData.getSensorType();nodeData = mData.getBytesData();b.putByteArray("endnodeData", nodeData);msg.what = Constants.WHAT_BLUETOOTH_ENDDEVICE_UPDATE;msg.setData(b);if (mHandler != null) mHandler.sendMessage(msg); else if (ret = 0) Log.i(&qu

21、ot;Java Handler", "timeout");System.out.println("讀取數(shù)據(jù)超時"); else if (ret = -1) / isReading = false;System.out.println("串口連接出錯"); else System.out.println("接收到串口數(shù)據(jù)出錯");Log.i("Java Handler", "read error");l Android通過Handler Message更新界面UI:O

22、verridepublic void handleMessage(Message msg) / TODO Auto-generated method stubsuper.handleMessage(msg);Bundle b = msg.getData();switch (msg.what) case Constants.WHAT_BLUETOOTH_ADDR:/掃描主設備?nodeData = b.getByteArray("nodeData");/什么意思?if (nodeData != null) scanData = getSendData(nodeData, 1)

23、;/將藍牙一幀數(shù)據(jù)的第32位設置為1,表示搜索addrFlag = true;majorAddr.setText(b.getString("majorAddr");/?System.out.println("Bluetooth-:"+ b.getString("majorAddr");bluetooth_scan.setEnabled(true);break;case Constants.WHAT_BLUETOOTH_SCAN_UPDATE:case Constants.WHAT_BLUETOOTH_SCAN2_UPDATE:/掃描從設備System.out.println("掃描到從設備,

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論