天天看点

Linux/windows com串口 java 接收数据 并解析 web程序

1.首先应公司要求再 com 口本来使用 .net 由于 .net 适用 linux 太麻烦 改为java 

准备工作 准备 RXTXconmm.jar(版本很重要) 因为版本问题我搞了一天。 

主要讲述linux 系统使用串口(windows 比 linux 更简单) 

话不多说直接上代码

@RequestMapping(value = "/porttest",method ={RequestMethod.POST,RequestMethod.GET})
        @ResponseBody
        public void  porttest(DevicesEntity devices,HttpServletRequest request) {
            
            serialPortTest  ss=new serialPortTest();
     
                ss.searchSerialPort(); // 搜索串口
                ss.connectSerialPort(); // 连接串口
        
        
            
    
        }      
public  void connectSerialPort() {
        // TODO Auto-generated method stub
        String comName;
        if (mListComName.size() > 0) {
            comName = mListComName.get(0);
            
            String PortName = comName;
            String rate_value = serialPortParms.RATE[1];
            String databit_value = serialPortParms.DATABIT[0];
            String stopbit_value = serialPortParms.STOPBIT[0];

            HashMap<String, Comparable> params = new HashMap<String, Comparable>();
            System.out.println(PortName+"!!!!!!!!!!!!!!!!!!!!!!!!!!");
            int parityInt = SerialPort.PARITY_NONE;
            params.put(serialReader.PARAMS_PORT, PortName); // 端口名称
            params.put(serialReader.PARAMS_RATE, rate_value); // 波特率
            params.put(serialReader.PARAMS_DATABITS, databit_value); // 数据位
            params.put(serialReader.PARAMS_STOPBITS, stopbit_value); // 停止位
            params.put(serialReader.PARAMS_PARITY, parityInt); // 无奇偶校验
            params.put(serialReader.PARAMS_TIMEOUT, 100); // 设备超时时间 1秒
            params.put(serialReader.PARAMS_DELAY, 100); // 端口数据准备时间 1秒
            try {
                sr.open(params);
                sr.addObserver(serialPortTest.this);
                System.out.println(PortName + ":已经打开");
            } catch (Exception e1) {
                System.out.println("端口被占用");
            }
        }
    }      
package ClientDemo;

import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;

import static com.jeecg.common.DateUtil.getNowDate;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Observable;
import java.util.TooManyListenersException;

import org.apache.log4j.Logger;
import org.jeecgframework.web.system.service.SystemService;
import org.springframework.beans.factory.annotation.Autowired;

import com.jeecg.pdwsn.entity.ChannelsEntity;
import com.jeecg.pdwsn.entity.DataEntity;
import com.jeecg.pdwsn.entity.DevicesEntity;
import com.jeecg.pdwsn.entity.SensorsEntity;
import com.jeecg.pdwsn.entity.WarningEntity;
import com.jeecg.pdwsn.service.DevicesServiceI;
import com.jeecg.pdwsn.service.SensorsServiceI;
import com.jeecg.pdwsn.service.impl.DevicesServiceImpl;

public class serialReader extends Observable implements Runnable,
        SerialPortEventListener {
    private static final Logger logger = Logger.getLogger(DevicesServiceImpl.class);
    
    static CommPortIdentifier portId;
    int delayRead = 100;
    int numBytes; //
    private static byte[] readBuffer = new byte[1024]; //
    //private static char[] readBuffer = new char[1024];
    static Enumeration portList;
    InputStream inputStream;
    OutputStream outputStream;
    static SerialPort serialPort;
    HashMap serialParams;
    Thread readThread;

    boolean isOpen = false;

    public static final String PARAMS_DELAY = "delay read"; //
    public static final String PARAMS_TIMEOUT = "timeout"; // 超时时间
    public static final String PARAMS_PORT = "port name"; // 端口名称
    public static final String PARAMS_DATABITS = "data bits"; //
    public static final String PARAMS_STOPBITS = "stop bits"; //
    public static final String PARAMS_PARITY = "parity"; // 奇偶校验
    public static final String PARAMS_RATE = "rate"; //
    private HashMap<Byte, byte[]> map;

    public boolean isOpen() {
        return isOpen;
    }

    /**
     * 初始化端口操作的参数.
     * 
     * @throws SerialPortException
     * 
     * @see
     */
    public serialReader() {
        isOpen = false;
    }

    public void open(HashMap params) throws NoSuchPortException,
            PortInUseException, IOException, UnsupportedCommOperationException,
            TooManyListenersException {
        serialParams = params;
        if (isOpen) {
            close();
        }
        /* try { */
        // 参数初始
        int timeout = Integer.parseInt(serialParams.get(PARAMS_TIMEOUT)
                .toString());
        int rate = Integer.parseInt(serialParams.get(PARAMS_RATE).toString());
        int dataBits = Integer.parseInt(serialParams.get(PARAMS_DATABITS)
                .toString());
        int stopBits = Integer.parseInt(serialParams.get(PARAMS_STOPBITS)
                .toString());
        int parity = Integer.parseInt(serialParams.get(PARAMS_PARITY)
                .toString());
        delayRead = Integer.parseInt(serialParams.get(PARAMS_DELAY).toString());
        String port = serialParams.get(PARAMS_PORT).toString();
        // 打开端口
        portId = CommPortIdentifier.getPortIdentifier(port);
        serialPort = (SerialPort) portId.open("SerialReader", timeout);
        inputStream = serialPort.getInputStream();
        serialPort.addEventListener(this);
        serialPort.notifyOnDataAvailable(true);
        serialPort.setSerialPortParams(rate, dataBits, stopBits, parity);
        isOpen = true;
        /*
         * } catch (PortInUseException e) { //
         * 端口"+serialParams.get( PARAMS_PORT ).toString()+"已经被占�?;
         * 
         * } catch (TooManyListenersException e) { // "端口"+serialParams.get(
         * PARAMS_PORT ).toString()+"监听者过�?; } catch
         * (UnsupportedCommOperationException e) { // "端口操作命令不支�?; } catch
         * (NoSuchPortException e) { // "端口"+serialParams.get( PARAMS_PORT
         * ).toString()+"不存�?; } catch (IOException e) { //
         * "打开端口"+serialParams.get( PARAMS_PORT ).toString()+"失败"; }
         */
        serialParams.clear();
    /*    Thread readThread = new Thread(this);
        readThread.start();*/
    }

    public void run() {
        try {
            Thread.sleep(50);
        } catch (InterruptedException e) {
        }
    }

    public void start() {
        try {
            outputStream = serialPort.getOutputStream();
        } catch (IOException e) {
        }
        try {
            readThread = new Thread(this);
            readThread.start();
        } catch (Exception e) {
        }
    } // start() end

    public void run(byte[] message) {
        try {
            Thread.sleep(4);
        } catch (InterruptedException e) {
        }
        try {
            if (message != null) {
                System.out.println("run message:" + message);
                outputStream.write(message);
            }
        } catch (IOException e) {
        }
    }

    public void close() {
        if (isOpen) {
            try {
                serialPort.notifyOnDataAvailable(false);
                serialPort.removeEventListener();
                inputStream.close();
                serialPort.close();
                isOpen = false;
            } catch (IOException ex) {
                // "关闭串口失败";
            }
        }
    }
    TempHumidity tempHumidity = new TempHumidity();
    private List<Double> fValue = new ArrayList<Double>();     // 温度值
    //char[] hex2char = hex.toCharArray();
    int[] buffer = new int[8192];
    int[] bufTmp = new int[2048];        // 接收数据缓冲区2
    int dataLen = 0;                        // 接收数据的总长度
    int step = 0;                           // 解析步骤
    int readBytes=0; 
    List<Double> splitt=new ArrayList<Double>();
    @Override
    public void serialEvent(SerialPortEvent event) {

        // TODO Auto-generated method stub
        try {
            Thread.sleep(delayRead);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        switch (event.getEventType()) {
        case SerialPortEvent.BI: // 10
        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
            int len=readBuffer.length;
            int count=0;
            try {
                // 多次读取,将所有数据读
                while (inputStream.available() > 0) {
                    count++;
                    
                    readBuffer = new byte[inputStream.available()];

                    numBytes =inputStream.read(readBuffer);
                        
                    
                        //readBuffer
                    
             System.out.println("readBuffer"+new char[inputStream.available()]+"SSsssssssssssssss"+numBytes);
                }
                
                // 打印接收到的字节数据
                //System.out.println("长度"+readBuffer[]+"readBuffer.toString();"+readBuffer.toString());
                int[] iBuffer = new int[8192];
                
                
                for (int i = 0; i < numBytes; i++) {
                    //System.out.println();
                /*    changeMessage(readBuffer, numBytes);*/
                
                    //iBuffer[i] = ((byte)readBuffer[i] & 0xff);
            
                    buffer[dataLen] =  ((byte)readBuffer[i] & 0xff);
                    System.out.println("原始数据\t\t\t"+    buffer[dataLen]);
                    logger.info("原始数据\t\t\t"+    buffer[dataLen]);
                        switch (step)
                        {
                            case 0:
                                //AA=170
                                if (0xAA == buffer[0])
                                {
                                    step++;
                                    dataLen++;
                                }
                                else
                                {
                                    step = 0;
                                    dataLen = 0;
                                }
                                break;
                            case 1:
                                step++;
                                dataLen++;
                                break;
                            case 2:
                                dataLen++;
                                if (dataLen >= buffer[1] + 2)
                                {
                                    step++;
                                }
                                break;
                            case 3:
                                //bb  十进制187
                                if (0xBB == buffer[dataLen])
                                {
                                    //0f =15  十进制
                                       //System.out.println("温度湿度"+buffer[1]);
                                       
                                    if (buffer[1] < 0x0F)
                                    {// 温湿度
                                        for (int j = 0; j < buffer[1]-4; j++)
                                        {
                                            bufTmp[j] = buffer[j + 4];
                                            //System.out.println("温度湿度"+buffer[j + 4]);
                                            
                                        }
                                        System.out.println("进入温湿度");
                                        AnalysisWenShiDu(8);
                                        
                                           //logger.info( "完整数据3 1"+iBuffer[i]);
                                        //logger.log(null, "AnalysisWenShiDu");
                                        //System.out.println("AnalysisWenShiDu");
                                    }
                                    else
                                    {// 电缆数据
                                        for (int j = 0; j < buffer[1] - 2; j++)
                                        {
                                            
                                            bufTmp[j] = buffer[j + 2];// 除去包头、长度、尾的数据
                                            //System.out.println(buffer[j + 2]+"除去包头、长度、尾的数据");
                                        }
                                       // System.out.println( "当前次数"+bufTmp[2]+"bufTmpbufTmpbufTmp\t\t "+bufTmp[i] );
                                        logger.info("当前次数"+bufTmp[2]+"bufTmpbufTmpbufTmp\t\t "+bufTmp[i]);
                                       // System.out.println( "bufTmpbufTmpbufTmp222\t\t "+bufTmp[2] );
                                        
                                        AnalysisData(bufTmp,bufTmp[2]);
                                        
                                        if (bufTmp[2] == 8)
                                        {// 第八条电缆数据
                                             
                                            
                                        ///插入数据;
                                            StringBuffer sssss=new StringBuffer();
                                            for (int j = 0; j < splitt.size(); j++) {
                                                
                                                sssss.append(splitt.get(j)+";");
                                            }
                                              
                                            HttpPostUtil.getHanYuanUtils("http://localhost:8080/jeecg/rest/webshishishuju/fasong?sssss="+sssss);
                                            
                                            
                                             splitt.clear();
                                              splitt = new ArrayList();
                                            dataLen = 0;
                                            
                                        }
                                    }
                                }
                                step = 0;
                                dataLen = 0;
                                break;
                            default:
                                step = 0;
                                dataLen = 0;
                                break;
                        }
                    
                }
                
                
                
            } catch (IOException e) {
                e.printStackTrace();
            }
            break;
        }
    
    }
     int cou=0;  
    @Autowired
    DevicesServiceI devicesService;
    @Autowired
    private SystemService systemService;
    @Autowired
    private SensorsServiceI sensorsServiceI;
/*    public List diaoyong() {
        
         
                
      return  splitt;
    }*/
     private List AnalysisData(int [] bufTmp2,int curGP)
     {
         try
         {    
                 
                //System.out.println("bufTmp2[1]原始数据"+bufTmp2[1]);
                //bufTmp2[4] == 20 
                 int len = bufTmp2[4] * 2;
                 int temp = 0;
                 Double ftemp = 0.0;
                 // 长度40
                 for (int i = 5; i < len +5; i++)
                 {
                     if (i % 2 == 1)
                     {
                         temp = bufTmp2[i] << 8;
                         temp += bufTmp2[i + 1];
                         //System.out.println("bufTmp2[i]"+bufTmp2[i]);
                        // System.out.println("temp"+temp);
                         int st = temp;
                        // System.out.println("ststst"+st);
                         if (st > 0)
                         {
                             ftemp = st * 0.0625;
                         }
                         else if (st < 0)
                         {
                             ftemp = -(~st + 1) * 0.0625;
                         }
                         else if (st == 0)
                         {
                             ftemp = 0.0;
                         }
                         
                         System.out.println(ftemp+"ftemp");
                         splitt.add(Double.parseDouble(new DecimalFormat("0.00").format(ftemp)));
                         
                         
                         
                   
                         i += 1;
                     }
                 }
         }
         catch (Exception e)
         {
         }
         return fValue;
     }
//     List<Double> wd=new ArrayList<Double>();
    private List AnalysisWenShiDu(int len)
    {
        // 仓内温湿度(T1H T1L H1H H1L)
        // 仓外温湿度(T2H T2L H2H H2L)
        tempHumidity.in_temp = GetFloat1(bufTmp[0], bufTmp[1]);
        tempHumidity.in_humidity = GetFloat1(bufTmp[2], bufTmp[3]);
   
        double a=GetFloat1(bufTmp[0], bufTmp[1]);
        
        double b=GetFloat1(bufTmp[2], bufTmp[3]);
        
        double c=GetFloat1(bufTmp[4], bufTmp[5]);
        double d=GetFloat1(bufTmp[6], bufTmp[7]);
        System.out.println("a温度"+a+"b湿度"+b);
      
        tempHumidity.out_temp = GetFloat1(bufTmp[4], bufTmp[5]);
        tempHumidity.out_humidity = GetFloat1(bufTmp[6], bufTmp[7]);
        
        splitt.add(Double.parseDouble(new DecimalFormat("0.00").format(a)));
        splitt.add(Double.parseDouble(new DecimalFormat("0.00").format(b)));
        splitt.add(Double.parseDouble(new DecimalFormat("0.00").format(c)));
        splitt.add(Double.parseDouble(new DecimalFormat("0.00").format(d)));
        return     splitt;
    }
    
    public static void main(String[] args) {
        int temp=0;
        
         temp = 170 << 8;
        // System.out.println(temp+"temp");
    }
    
    private float GetFloat1(int bufTmp2,int bufTmp3)
    {
        int temp = 0;
        float ftemp = 0f;
        temp = bufTmp2 << 8;
        temp += bufTmp3;
        int st = temp;
        if (st > 0)
        {
            ftemp = st * 0.1f;
        }
        else if (st < 0)
        {
            ftemp = (0xFFFF - temp) * 0.1f;
        }
        else if (st == 0)
        {
            ftemp = 0;
        }
        //System.out.println("温度湿度!!!!!!!!!!!!!!!!!!!!!!!!!"+ftemp);
        
        return ftemp;
        
        
    }
    // 通过observer pattern将收到的数据给observer
    // 将buffer中的空字节删除后再发送更新消息通知观察者
    public void changeMessage(byte[] message, int length) {
        boolean flag = false;
        byte type = message[3];
        setChanged();
        notifyObservers(message);
    }

    static void listPorts() {
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier portIdentifier = (CommPortIdentifier) portEnum
                    .nextElement();

        }
    }

    static String getPortTypeName(int portType) {
        switch (portType) {
        case CommPortIdentifier.PORT_I2C:
            return "I2C";
        case CommPortIdentifier.PORT_PARALLEL:
            return "Parallel";
        case CommPortIdentifier.PORT_RAW:
            return "Raw";
        case CommPortIdentifier.PORT_RS485:
            return "RS485";
        case CommPortIdentifier.PORT_SERIAL:
            return "Serial";
        default:
            return "unknown type";
        }
    }

    public HashSet<CommPortIdentifier> getAvailableSerialPorts()// 本来static
    {
        HashSet<CommPortIdentifier> h = new HashSet<CommPortIdentifier>();
        Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();
        while (thePorts.hasMoreElements()) {
            CommPortIdentifier com = (CommPortIdentifier) thePorts
                    .nextElement();
            switch (com.getPortType()) {
            case CommPortIdentifier.PORT_SERIAL:
                try {
                    CommPort thePort = com.open("CommUtil", 50);
                    thePort.close();
                    h.add(com);
                } catch (PortInUseException e) {
                    System.out.println("Port, " + com.getName()
                            + ", is in use.");
                } catch (Exception e) {
                    System.out.println("Failed to open port " + com.getName()
                            + e);
                }
            }
        }
        return h;
    }
     public class TempHumidity
        {
            public float in_temp;       // 舱内温度
            public float in_humidity;   // 舱内湿度
            public float out_temp;
            public float out_humidity;
        }
}      
public class serialPortParms {
        public static final String[] RATE = { "115200", "9600", "4800", "2400" };
        public static final String[] DATABIT = { "8", "7", "6", "5" };
        public static final String[] STOPBIT = { "1", "1.5", "2" };

}      

如果解析失败 查看 RXTXconmm.jar 版本

技术交流qq 1552138571