Android端 同 單片機(jī) 利用藍(lán)牙模塊的通信實(shí)現(xiàn)_第1頁
Android端 同 單片機(jī) 利用藍(lán)牙模塊的通信實(shí)現(xiàn)_第2頁
Android端 同 單片機(jī) 利用藍(lán)牙模塊的通信實(shí)現(xiàn)_第3頁
Android端 同 單片機(jī) 利用藍(lán)牙模塊的通信實(shí)現(xiàn)_第4頁
Android端 同 單片機(jī) 利用藍(lán)牙模塊的通信實(shí)現(xiàn)_第5頁
全文預(yù)覽已結(jié)束

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

Android端同單片機(jī)利用藍(lán)牙模塊的通信實(shí)現(xiàn)這次期末的課程設(shè)計(jì)做了一個(gè)智能燈光控制系統(tǒng),系統(tǒng)整體的功能不在此贅述,系統(tǒng)主要是要實(shí)現(xiàn)下位機(jī)同上位機(jī)的通信,上位機(jī)選用的是Android手機(jī)端,下位機(jī)是52單片機(jī),通過藍(lán)牙模塊實(shí)現(xiàn)通信。雖然系統(tǒng)很簡(jiǎn)單,但還是第一次完成的走完從下位機(jī)數(shù)據(jù)采集,數(shù)據(jù)傳輸,再到上位機(jī)的處理這個(gè)流程,故在這里做一個(gè)記錄,也希望能夠幫到有需要的人。一、下位機(jī)通信下位機(jī)選用的是52單片機(jī),數(shù)據(jù)來自幾個(gè)傳感器,傳感器采集到數(shù)據(jù)后通過串口發(fā)送到藍(lán)牙模塊,然后藍(lán)牙模塊發(fā)送到上位機(jī)。因代碼量較大,所以只在這里貼出傳輸有關(guān)的函數(shù)。//利用串口發(fā)送一個(gè)字符voidSendOneByte(unsignedcharc){SBUF=c;while(!TI);TI=0;}//重寫putchar函數(shù),就可以直接調(diào)用printf()函數(shù)向串口發(fā)送數(shù)據(jù),程序自動(dòng)將printf()中的數(shù)據(jù)轉(zhuǎn)換成char調(diào)用putchar發(fā)送charputchar(charch){ES=0;SBUF=ch;while(!TI);TI=0;ES=1;return0;}//初始化串口voidInitUART(){TMOD=0x20;PCON=0x00;SCON=0x50;TH1=0xFD;TL1=0xFD;TR1=1;ES=1;EA=1;}//串口中斷voidUARTInterrupt()interrupt4{//RI為1則表示串口接收到數(shù)據(jù)if(RI){RI=0;r_buf=SBUF;//價(jià)格SBUF中的數(shù)據(jù)賦給r_buf,然后就可以對(duì)數(shù)據(jù)進(jìn)行處理}}voidmain(){InitUART();while(1){}}二、藍(lán)牙模塊藍(lán)牙模塊我選用的是HC-05,這個(gè)模塊我之前也沒用使用過,查詢了一些資料后就能夠上手了,感覺還是很好用。模塊有六個(gè)引腳,如果用的是帶一個(gè)小按鈕的HC-05,EN就不用接;然后VCC和GND分別接電源和地;TXD和RXD在配置AT指令的時(shí)候分別接單片機(jī)的TXD和RXD,但是在正常使用時(shí),HC-05的TXD和RXD分別接單片機(jī)的RXD和TXD,這個(gè)需要注意;還有一個(gè)引腳是state,當(dāng)有藍(lán)牙連接的時(shí)候會(huì)置1,將其隨意連接到單片機(jī)的引腳上。使用前先利用AT指令集配置模塊,設(shè)置波特率和主從模式等,然后就可以連線使用。連接后藍(lán)牙模塊會(huì)進(jìn)入快閃模式,進(jìn)入AT指令集后會(huì)進(jìn)入慢閃模式,當(dāng)有藍(lán)牙設(shè)備連接后會(huì)進(jìn)入雙閃模式。三、Android端程序Android端主要就是接受數(shù)據(jù),做出一定處理,還需發(fā)送指令給單片機(jī)。我用的代碼也是在網(wǎng)上找的然后又做了一些修改,源代碼出處找不到了。主要代碼如下:1、DeveiceListActivity類publicclassDeviceListActivityextendsActivity{//調(diào)試用privatestaticfinalStringTAG="DeviceListActivity";privatestaticfinalbooleanD=true;//返回時(shí)數(shù)據(jù)標(biāo)簽publicstaticStringEXTRA_DEVICE_ADDRESS="設(shè)備地址";//成員域privateBluetoothAdaptermBtAdapter;privateArrayAdapter<String>mPairedDevicesArrayAdapter;privateArrayAdapter<String>mNewDevicesArrayAdapter;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);//創(chuàng)建并顯示窗口requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);//設(shè)置窗口顯示模式為窗口方式setContentView(R.layout.device_list);//設(shè)定默認(rèn)返回值為取消setResult(Activity.RESULT_CANCELED);//設(shè)定掃描按鍵響應(yīng)ButtonscanButton=(Button)findViewById(R.id.button_scan);scanButton.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){doDiscovery();v.setVisibility(View.GONE);}});//初使化設(shè)備存儲(chǔ)數(shù)組mPairedDevicesArrayAdapter=newArrayAdapter<String>(this,R.layout.device_name);mNewDevicesArrayAdapter=newArrayAdapter<String>(this,R.layout.device_name);//設(shè)置已配隊(duì)設(shè)備列表ListViewpairedListView=(ListView)findViewById(R.id.paired_devices);pairedListView.setAdapter(mPairedDevicesArrayAdapter);pairedListView.setOnItemClickListener(mDeviceClickListener);//設(shè)置新查找設(shè)備列表ListViewnewDevicesListView=(ListView)findViewById(R.id.new_devices);newDevicesListView.setAdapter(mNewDevicesArrayAdapter);newDevicesListView.setOnItemClickListener(mDeviceClickListener);//注冊(cè)接收查找到設(shè)備action接收器IntentFilterfilter=newIntentFilter(BluetoothDevice.ACTION_FOUND);this.registerReceiver(mReceiver,filter);//注冊(cè)查找結(jié)束action接收器filter=newIntentFilter(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);this.registerReceiver(mReceiver,filter);//得到本地藍(lán)牙m(xù)BtAdapter=BluetoothAdapter.getDefaultAdapter();}@OverrideprotectedvoidonDestroy(){super.onDestroy();//關(guān)閉服務(wù)查找if(mBtAdapter!=null){mBtAdapter.cancelDiscovery();}//注銷action接收器this.unregisterReceiver(mReceiver);}publicvoidOnCancel(Viewv){finish();}/***開始服務(wù)和設(shè)備查找*/privatevoiddoDiscovery(){if(D)Log.d(TAG,"doDiscovery()");//在窗口顯示查找中信息setProgressBarIndeterminateVisibility(true);setTitle("查找設(shè)備中...");//顯示其它設(shè)備(未配對(duì)設(shè)備)列表findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);//關(guān)閉再進(jìn)行的服務(wù)查找if(mBtAdapter.isDiscovering()){mBtAdapter.cancelDiscovery();}//并重新開始mBtAdapter.startDiscovery();}//選擇設(shè)備響應(yīng)函數(shù)privateOnItemClickListenermDeviceClickListener=newOnItemClickListener(){publicvoidonItemClick(AdapterView<?>av,Viewv,intarg2,longarg3){//準(zhǔn)備連接設(shè)備,關(guān)閉服務(wù)查找mBtAdapter.cancelDiscovery();//得到mac地址Stringinfo=((TextView)v).getText().toString();Stringaddress=info.substring(info.length()-17);//設(shè)置返回?cái)?shù)據(jù)Intentintent=newIntent();intent.putExtra(EXTRA_DEVICE_ADDRESS,address);//設(shè)置返回值并結(jié)束程序setResult(Activity.RESULT_OK,intent);finish();}};//查找到設(shè)備和搜索完成action監(jiān)聽器privatefinalBroadcastReceivermReceiver=newBroadcastReceiver(){@OverridepublicvoidonReceive(Contextcontext,Intentintent){Stringaction=intent.getAction();//查找到設(shè)備actionif(BluetoothDevice.ACTION_FOUND.equals(action)){//得到藍(lán)牙設(shè)備BluetoothDevicedevice=intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);//如果是已配對(duì)的則略過,已得到顯示,其余的在添加到列表中進(jìn)行顯示if(device.getBondState()!=BluetoothDevice.BOND_BONDED){mNewDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}else{//添加到已配對(duì)設(shè)備列表mPairedDevicesArrayAdapter.add(device.getName()+"\n"+device.getAddress());}//搜索完成action}elseif(BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)){setProgressBarIndeterminateVisibility(false);setTitle("選擇要連接的設(shè)備");if(mNewDevicesArrayAdapter.getCount()==0){StringnoDevices="沒有找到新設(shè)備";mNewDevicesArrayAdapter.add(noDevices);}}}};}

2、Client類publicclassBTClientextendsActivity{privatefinalstaticintREQUEST_CONNECT_DEVICE=1;//宏定義查詢?cè)O(shè)備句柄privatefinalstaticStringMY_UUID="00001101-0000-1000-8000-00805F9B34FB";//SPP服務(wù)UUID號(hào)privateInputStreamis;//輸入流,用來接收藍(lán)牙數(shù)據(jù)privateEditTextedit0;//發(fā)送數(shù)據(jù)輸入句柄privateTextViewlightSwitch;privateTextViewlightStrength;privateTextViewlightMode;privateTextViewlightPower;privateStringswitchMsg="";privateStringstrengthMsg="";privateStringmodeMsg="";BluetoothDevice_device=null;//藍(lán)牙設(shè)備BluetoothSocket_socket=null;//藍(lán)牙通信socketbooleanbRun=true;booleanbThread=false;booleantimesign=false;privateBluetoothAdapter_bluetooth=BluetoothAdapter.getDefaultAdapter();//獲取本地藍(lán)牙適配器,即藍(lán)牙設(shè)備/**Calledwhentheactivityisfirstcreated.*/@OverridepublicvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.main);//設(shè)置畫面為主畫面main.xmledit0=(EditText)findViewById(R.id.Edit0);//得到輸入框句柄lightSwitch=(TextView)findViewById(R.id.lightSwitch);lightStrength=(TextView)findViewById(R.id.lightStrength);lightMode=(TextView)findViewById(R.id.lightMode);lightPower=(TextView)findViewById(R.id.lightpower);lightSwitch.setText("關(guān)閉");lightStrength.setText("8");lightMode.setText("時(shí)間調(diào)節(jié)模式");lightPower.setText("無數(shù)據(jù)");//如果打開本地藍(lán)牙設(shè)備不成功,提示信息,結(jié)束程序if(_bluetooth==null){Toast.makeText(this,"無法打開手機(jī)藍(lán)牙,請(qǐng)確認(rèn)手機(jī)是否有藍(lán)牙功能!",Toast.LENGTH_LONG).show();finish();return;}//設(shè)置設(shè)備可以被搜索newThread(){publicvoidrun(){if(_bluetooth.isEnabled()==false){_bluetooth.enable();}}}.start();}//發(fā)送按鍵響應(yīng)publicvoidonSendButtonClicked(Viewv){try{OutputStreamos=_socket.getOutputStream();//藍(lán)牙連接輸出流modeMsg=edit0.getText().toString();if(modeMsg.equals("1")||modeMsg.equals("2")||modeMsg.equals("3")){if(modeMsg.equals("1")){lightMode.setText("手動(dòng)調(diào)節(jié)模式");lightPower.setText("無數(shù)據(jù)");timesign=false;}elseif(modeMsg.equals("2")){lightMode.setText("自動(dòng)調(diào)節(jié)模式");timesign=false;}elseif(modeMsg.equals("3")){lightMode.setText("時(shí)間調(diào)節(jié)模式");lightPower.setText("無數(shù)據(jù)");}}if(timesign){finalinttimec=Integer.valueOf(modeMsg).intValue()*1000;//CountDownTimercdt=newCountDownTimer(timec,timec){//@Override//publicvoidonTick(longmillisUntilFinished){//}////@Override//publicvoidonFinish(){//edit0.setText("3");//}//};//cdt.start();try{Thread.currentThread().sleep(timec);}catch(InterruptedExceptione){e.printStackTrace();}edit0.setText("3");}if(modeMsg.equals("3")&&!timesign)timesign=true;byte[]bos=edit0.getText().toString().getBytes();edit0.setText("");os.write(bos);}catch(IOExceptione){}}//接收活動(dòng)結(jié)果,響應(yīng)startActivityForResult()publicvoidonActivityResult(intrequestCode,intresultCode,Intentdata){switch(requestCode){caseREQUEST_CONNECT_DEVICE://連接結(jié)果,由DeviceListActivity設(shè)置返回//響應(yīng)返回結(jié)果if(resultCode==Activity.RESULT_OK){//連接成功,由DeviceListActivity設(shè)置返回//MAC地址,由DeviceListActivity設(shè)置返回Stringaddress=data.getExtras().getString(DeviceListActivity.EXTRA_DEVICE_ADDRESS);//得到藍(lán)牙設(shè)備_device=_bluetooth.getRemoteDevice(address);//用服務(wù)號(hào)得到sockettry{_socket=_device.createRfcommSocketToServiceRecord(UUID.fromString(MY_UUID));}catch(IOExceptione){Toast.makeText(this,"連接失??!",Toast.LENGTH_SHORT).show();}//連接socketButtonbtn=(Button)findViewById(R.id.Button03);try{_socket.connect();Toast.makeText(this,"連接"+_device.getName()+"成功!",Toast.LENGTH_SHORT).show();btn.setText("斷開");}catch(IOExceptione){try{Toast.makeText(this,"連接失敗!",Toast.LENGTH_SHORT).show();_socket.close();_socket=null;}catch(IOExceptionee){Toast.makeText(this,"連接失敗!",Toast.LENGTH_SHORT).show();}return;}//打開接收線程try{is=_socket.getInputStream();//得到藍(lán)牙數(shù)據(jù)輸入流}catch(IOExceptione){Toast.makeText(this,"接收數(shù)據(jù)失??!",Toast.LENGTH_SHORT).show();return;}if(bThread==false){ReadThread.start();bThread=true;}else{bRun=true;}}break;default:break;}}//接收數(shù)據(jù)線程ThreadReadThread=newThread(){publicvoidrun(){intnum=0;byte[]buffer=newbyte[1024];bRun=true;//接收線程while(true){try{while(is.available()==0){while(bRun==false){}}while(true){num=is.read(buffer);//讀入數(shù)據(jù)Strings=newString(buffer,0,num);switchMsg=s;strengthMsg=s;if

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論