关闭

Java接收串口数据

标签: java串口数据
1505人阅读 评论(1) 收藏 举报
分类:

参考《ava接收串口数据》,开源中国社区

  • 自己的使用经验:
  • 1.ReadPort()虽然可以提供外部java读取数据,但最好添加一个延时,否则很容易出现读取若干次后程序没有响应,但又不报错的问题。
  • 2.此程序中serialPort.addEventListener(this);有可能会产生触发不了数据接收程序。所以最好在本地建立本程序的实例,然后加载该实例就可以读取到数据了。
    SerialBean serialBean = new SerialBean();
    serialPort.addEventListener(serialBean);
  • 3.信息的标志位这个还是自定义一下比较好。
import java.io.*;
import java.util.*;
import javax.comm.*;

public class SerialBean implements Runnable,SerialPortEventListener
{
    String PortName;
    int baud;
    CommPortIdentifier portId;
    SerialPort serialPort;
    static OutputStream out;
    static InputStream in;
    String Buf=null;// 缓存一条最新信息
    boolean hasData=false;// 标志有无新数据
    StringBuilder buf=new StringBuilder(128);
    Thread readThread;

    public SerialBean(int PortID,int baud)
    {
        PortName="COM"+PortID;
        this.baud=baud;

    }

    public int Initialize()
    {
        int InitSuccess=1;
        int InitFail=-1;
        try
        {
            portId=CommPortIdentifier.getPortIdentifier(PortName);
            try
            {
                serialPort=(SerialPort)portId.open("Serial_Communication",2000);
                serialPort.setSerialPortParams(this.baud,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
                serialPort.addEventListener(this);
                serialPort.notifyOnDataAvailable(true);
            }
            catch(PortInUseException e)
            {
                return InitFail;
            }
            catch(TooManyListenersException e)
            {
                return InitFail;
            }
            catch(UnsupportedCommOperationException e)
            {
                return InitFail;
            }
            try
            {
                in=serialPort.getInputStream();
                out=serialPort.getOutputStream();
            }
            catch(IOException e)
            {
                return InitFail;
            }

        }
        catch(NoSuchPortException e)
        {
            return InitFail;
        }
        readThread=new Thread(this);
        readThread.start();
        return InitSuccess;
    }

    public boolean hasData()
    {
        return hasData;
    }
    public String ReadPort()
    {
        if(hasData)
        {
            this.hasData=false;
            return this.Buf;
        }
        else
            return null;
    }

    @SuppressWarnings("deprecation")
    public void ClosePort()
    {
        if(readThread!=null )
            readThread.stop();
        if(serialPort!=null)
            serialPort.close();
    }
    @Override
    public void serialEvent(SerialPortEvent event)
    {
        /**
         * 事件类型:
         * 
         * BI -通讯中断.    CD -载波检测.    CTS -清除发送.    DATA_AVAILABLE -有数据到达.   
         * DSR-数据设备准备好.    FE -帧错误.    OE -溢位错误.    OUTPUT_BUFFER_EMPTY
         * -输出缓冲区已清空.    PE -奇偶校验错. RI - 振铃指示.
         */
        switch(event.getEventType())
        {
            case SerialPortEvent.BI:
            case SerialPortEvent.OE:
            case SerialPortEvent.FE:
            case SerialPortEvent.PE:
            case SerialPortEvent.CD:
            case SerialPortEvent.CTS:
            case SerialPortEvent.DSR:
            case SerialPortEvent.RI:
            case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
                break;
            case SerialPortEvent.DATA_AVAILABLE:

                try
                {
                    char b;
                    while(in.available()>0)
                    {
                        b=(char)in.read();
                        buf.append(b);
                    }
                    int beg=0,end=0;
                    for(int i=0;;i++)
                    {
                        if(buf.length()<2)
                        {
                            return;
                        }
                        if(buf.charAt(0)=='\r'&&buf.charAt(1)=='\n')// 以回车换行开头
                        {
                            beg=2;
                        }
                        else
                        // 不以换行开头
                        {
                            beg=0;
                        }
                        end=buf.indexOf("\r\n",beg);
                        if(end==-1)// 未接受完一整条信息
                            break;
                        Buf=buf.substring(beg,end);// 截取数据
                        buf.delete(0,end+2);// 删除已用数据
                        System.out.printf("--%s--\n",Buf);
                        this.hasData=true;

                    }

                    // System.out.println(con);
                }
                catch(IOException e)
                {
                }
                break;
        }
    }

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

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:56219次
    • 积分:890
    • 等级:
    • 排名:千里之外
    • 原创:26篇
    • 转载:25篇
    • 译文:2篇
    • 评论:3条
    最新评论