程序目的:通過串口傳送命令控制ZigBee的雙聯繼電器來控制風扇的開關
【1】畫ui 一個Spinner用來選擇需要控制的風扇 兩個Button分別用來控制開關
【2】打開串口
1.判斷句柄值 如果大於0則串口已經打開 先把串口關閉傳入句柄值后在打開
2.發送命令 把命令轉換為Sring類型
1 // 打開ZigBee串口和線程 2 public void OpenZigBee() { 3 // 句柄值>0表示串口打開如果串口已經打開先關閉 4 if (ShareData.com_fdZigBee > 0) 5 // 關閉串口 傳入句柄值 6 SerialPort.closePort(ShareData.com_fdZigBee); 7 /** 8 * 讀取串口設置值,無線傳感網默認值為0 9 * 10 * @port:串口 ,1代表com1,2代表com2...等等 11 * @mode: 接入方式,選擇 com口還是usb com是0 usb是1 12 * @baudRate:波特率, 1200 --- 0 2400 --- 1 4800 --- 2 9600 --- 3 19200 --- 13 * 4 38400 --- 5 57600 --- 6 115200 ---7 230400 --- 8 14 * 921600 --- 9 15 * 16 * @return ShareData.com_fdZigBee 句柄值 17 */ 18 ShareData.com_fdZigBee = SerialPort.openPort(6, 1, 5); 19 // 打開Zigbee數據接收 20 Intent intent = new Intent(this, ZigBeeService.class); 21 this.startService(intent); 22 23 }
1 // 發送命令 2 private static void sendCMD(char[] cmd) { 3 // 把命令轉為為String格式 4 String strcmd = String.valueOf(cmd); 5 /** 6 * 向硬件發送命令 7 * 8 * @param fd 9 * 句柄值 10 * @param pBuffer 11 * 字符串 12 * @param Length 13 * 字符長度 14 * @return 15 */ 16 Linuxc.sendMsgUartHex(ShareData.com_fdZigBee, strcmd, strcmd.length()); 17 }
【3】初始化UI
1.填充下拉框值
2.為下拉框設置適配器
3.獲取選中的名稱
5.分別設置兩個按鈕的監聽 並根據下拉框的選擇判斷風扇的開關
1 private void initView() { 2 // 填充下拉框的值 3 String[] items = { "請選擇", "風扇1", "風扇2", "風扇3" }; 4 // 下拉框適配器 5 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, 6 android.R.layout.simple_list_item_1, items); 7 Spinner sp = (Spinner) findViewById(R.id.control_spinner); 8 // 為下拉框設置適配器 9 sp.setAdapter(adapter); 10 // 下拉框設置監聽 11 sp.setOnItemSelectedListener(new OnItemSelectedListener() { 12 13 @Override 14 public void onItemSelected(AdapterView<?> parent, View view, 15 int position, long id) { 16 // 獲取選中的名稱 17 String itemName = parent.getItemAtPosition(position).toString(); 18 // 設置當前風扇為選中的風扇 19 mControlName = itemName; 20 } 21 22 @Override 23 public void onNothingSelected(AdapterView<?> parent) { 24 // TODO Auto-generated method stub 25 26 } 27 }); 28 // 設置打開按鈕的監聽 29 mControlOpenBtn = (Button) findViewById(R.id.open_btn); 30 mControlOpenBtn.setOnClickListener(new OnClickListener() { 31 32 @Override 33 public void onClick(View v) { 34 // 如果打開的是風扇 ,發送打開風扇命令 35 if ("風扇1".equals(mControlName)) { 36 // 開啟風扇1 37 sendCMD(fanOpenCommand); 38 } else if ("風扇2".equals(mControlName)) { 39 // 開啟風扇2 40 sendCMD(fan2OpenCommand); 41 } else if ("風扇3".equals(mControlName)) { 42 // 開啟風扇3 43 sendCMD(fan3OpenCommand); 44 } 45 } 46 }); 47 // 設置關閉的監聽 48 mControlCloseBtn = (Button) findViewById(R.id.close_btn); 49 mControlCloseBtn.setOnClickListener(new OnClickListener() { 50 51 @Override 52 public void onClick(View v) { 53 // 發送關閉風扇命令 54 if ("風扇1".equals(mControlName)) { 55 // 關閉風扇1 56 sendCMD(fanCloseCommand); 57 } else if ("風扇2".equals(mControlName)) { 58 // 關閉風扇2 59 sendCMD(fan2CloseCommand); 60 } else if ("風扇3".equals(mControlName)) { 61 // 關閉風扇3 62 sendCMD(fan3CloseCommand); 63 } 64 } 65 }); 66 }
【4】關閉串口 使句柄值為-1
1 private void closePort() { 2 // 判斷串口是否打開 如果打開就關閉 3 if (ShareData.com_fdZigBee > 0) 4 SerialPort.closePort(ShareData.com_fdZigBee); 5 ShareData.com_fdZigBee = -1; // java.lang.ArrayIndexOutOfBoundsException: 6 }
【5】銷毀程序 在程序退出時關閉串口
1 @Override 2 protected void onDestroy() { 3 // 在程序退出的時候關閉串口 4 closePort(); 5 super.onDestroy(); 6 }