无线传感网实训做的项目是简单智慧医疗,采集人体的心率、体温、血氧等参数,zigbee传输数据,再由中心节点通过上位机将数据存储到数据库中,在云端进行数据的读取显示。由于没有适合的串口工具,故使用RXTX串口结合ZhongLei已经开发的串口工具修改了实训可用的工具。

  • 修改内容:

    • 原代码使用Eclipse进行开发,这里使用IDEA。
    • 添加了数据库的操作,将将数据存入数据库中。在durid.properties中修改url=jdbc:mysql:///sqlName
    • 使用Socket编程,可将数据发送到服务器,可结合WIFI模块实现数据传输。
  • Bug:双缓冲出现重影,使用外接显示器不会有这个问题。

项目地址:https://github.com/iotwd/RXTX-zigbee

开发准备

开发环境

  • Windows 10
  • jdk1.8
  • IDEA

下载资源文件

首先下载RXTX库对应的文件。下载地址 http://fizzed.com/oss/rxtx-for-java,我这里下载使用Windows-x64,可根据自己的系统下载对应的文件。

拷贝动态库

RXJX的实现需要依赖两个动态库,所以要先把动态库放到对应的jdk目录下面去。

  • 拷贝 rxtxSerial.dll —> <JAVA_HOME>\jre\bin
  • 拷贝 rxtxParallel.dll —> <JAVA_HOME>\jre\bin

将RXTXcomm.jar 导入

在IDEA->File->Project Structure->Modules->Dependencies添加RXTXcomm.jar

自定义修改

文件结构:

  • exception:串口工具开发相关文件。
  • socket:使用tcp协议将数据发送给服务器。
  • utils:串口工具类,实现查找端口、关闭端口、读数据、发送数据、添加事件监听器等。
  • View: 实现画图类和数据的操作读取等。
  • Client:主页面调用等。

主要修改内容:处理监控到的串口事件的SerialListener类

// 自定义解析过程,你在实际使用过程中可以按照自己的需求在接收到数据后对数据进行解析

 /**
     * 处理监控到的串口事件
     */
private class SerialListener implements SerialPortEventListener {
    @Override
    public void serialEvent(SerialPortEvent serialPortEvent) {
        switch (serialPortEvent.getEventType()) {
            case SerialPortEvent.BI://10通讯中断
                JOptionPane.showMessageDialog(null, "与串口通讯中断", "错误", JOptionPane.INFORMATION_MESSAGE);
                break;

            case SerialPortEvent.OE: // 7 溢位(溢出)错误

            case SerialPortEvent.FE: // 9 帧错误

            case SerialPortEvent.PE: // 8 奇偶校验错误

            case SerialPortEvent.CD: // 6 载波检测

            case SerialPortEvent.CTS: // 3 清除待发送数据

            case SerialPortEvent.DSR: // 4 待发送数据准备好了

            case SerialPortEvent.RI: // 5 振铃指示

            case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空
                break;
            case SerialPortEvent.DATA_AVAILABLE: // 1 串口存在可用数据
                System.out.println("找到数据");
                byte[] data = null;
                try {
                    if (serialPort == null) {
                        JOptionPane.showMessageDialog(null, "串口对象为空!监听失败!", "错误", JOptionPane.INFORMATION_MESSAGE);
                    } else {
                        data = serialPortManager.readFromPort(serialPort);    //读取数据,存入字节数组
                        //  System.out.println("test1");
                        System.out.println(new String(data));
                        /*在这个地方自定义解析过程 这里需要知道采集的数据格式,利用正则解析需要的数据*/
                        if (data == null || data.length < 1) {
                            JOptionPane.showMessageDialog(null, "读取数据过程中未获取到有效数据!请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE);
                            System.exit(0);
                        } else {
                            //初始数据是data
                            String dataOriginal = new String(data);
                            //   System.out.println("test2");
                            System.out.println("原始数据:" + dataOriginal);

                            //把原始数据写入到D盘的txt文件中
                            try {
                                File file = new File("D:/OriginalResult.txt");
                                PrintStream ps = new PrintStream(new FileOutputStream(file, true));;
                                ps.append(dataOriginal + "\r\n");
                                ps.flush();
                                ps.close();
                            } catch (FileNotFoundException eg) {
                                eg.printStackTrace();
                            }
                            String dataValid = "";//有效数据 保存原始数据字符串去除最开头*号以后的字符串
                            String[] elements = null;//保存按空格拆分原始字符串后得到的字符串数组
                                //            执行到了这里
                                //解析数据
                            if (dataOriginal.charAt(0) =='S') {//当数据的第一个字符是#号时表示数据接收完成,开始解析
                                dataValid = dataOriginal.substring(0);
//                                    String regex="\\D+";
                                String regex="\\D+(\\.\\D+)?";//解析字符串里的整数或者小数
                                elements = dataValid.split(regex);//按空格解析数据
                                    //String regex="\\D+";
                                // elements = dataValid.split(regex);//按空格解析数据
                                for(String string:elements){
                                    System.out.println(string);
                                }
                                if (elements == null || elements.length < 1) {//检查数据是否解析正确
                                    JOptionPane.showMessageDialog(null, "数据解析过程出错,请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE);
                                    System.exit(0);
                                } else {
                                    try {
                                        //定义发送到数据库的对象
                                        SendToWeb sendToWeb = new SendToWeb();
                                        String message="";
//                                           处理心率
                                        Integer heartRate = new Integer(elements[2]);
                                        if(heartRate<120&&heartRate>40){
                                            message=elements[2];
                                        }
                                        //处理血氧
                                        Integer bloodOxygen = new Integer(elements[3]);
                                        if(bloodOxygen<120&&bloodOxygen>40){
                                            message=elements[2];
                                        }
                                        //处理温度
                                        Float temperature = Float.parseFloat(elements[0]);
                                        if(temperature<41&&heartRate>35) {
                                            message = elements[2];
                                        }
                                        //处理时间
                                        Date nowTime=new Date();
                                        String t1=String.format("%tY-%<tm-%<td-%<tH:%<tM:%<tS",nowTime);
                                        if(elements[0]!=null && elements[1]!=null&&elements[2]!=null){
                                            //创建发送的信息
                                            message=elements[0] + "#" + elements[1] + "#" + elements[2] + "#"+ t1;
                                            //发送数据到数据库
                                            //sendToWeb.sendMessage(message);
                                            //显示到文本区/测试
                                            textArea.setText(message);
                                        }

                                        message=elements[1] + "#" + elements[2] +"#"+elements[3] +  "#"+ t1;
                                        Thread.currentThread().sleep(10000);
                                        //发送数据到数据库
                                        sendToWeb.sendMessage(message);
                                        //显示到文本区/测试
                                        System.out.println(message);
                                        textArea.setText(message);


                                    } catch (ArrayIndexOutOfBoundsException e) {
                                        JOptionPane.showMessageDialog(null, "数据解析过程出错,更新界面数据失败!请检查设备或程序!", "错误", JOptionPane.INFORMATION_MESSAGE);
                                        System.exit(0);
                                    }
                                    catch (InterruptedException e) {
                                        e.printStackTrace();
                                    }
                                }
                            }
                        }
                    }
                } catch (ReadDataFromSerialPortFailure | SerialPortInputStreamCloseFailure e) {
                    JOptionPane.showMessageDialog(null, e, "错误", JOptionPane.INFORMATION_MESSAGE);
                    System.exit(0);    //发生读取错误时显示错误信息后退出系统
                }
                break;
        }
    }
}

遇到的错误

  • 未将rxtxSerial.dll rxtxParallel.dll 移动到 <JAVA_HOME>jrebin,无法启动。

(参考:使用Java实现简单串口通信)[https://www.cnblogs.com/dreamer-1/p/5523046.html]

文章目录