程序目的:通过串口传送命令控制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 }