Java接收串口数据

2 篇文章 0 订阅
1 篇文章 0 订阅

参考《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
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值