Java接收串口数据

转载 2015年07月09日 17:25:32

参考《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)
        {
        }
    }
}

文件读写遇到InputStream.available()一直返回0

InputStream lastRevision = af.extractLastRevision(name);             if (null == lastRevision)    ...

iOS开发- 蓝牙后台接收数据(BLE4.0)

最近在做一个蓝牙相关的项目, 需要在应用进入后台, 或者手机属于锁屏状态的情况下, 仍然保持蓝牙连接, 并且能正常接收数据。 本来以后会很麻烦, 但是学习了下..发现就2步而已。简单的不能再简单...

java RS232串口通讯(电子天平数据抓取)

写这篇文章是为了记录RS232串口通讯,当时有个央企项目里需要实现自动抓取RS232串口数据,需要支持主要浏览器:Chrome,Firefox,IE8以上等。看了很多有关rs232的资料和也找了很多方...

基于java数据采集串口通讯的设计和实现

基于java数据采集串口通讯的设计和实现DesignandRealizationoftheSerialCommunicationforDataAcquisitionBasedOnJava(武汉中国地质...

LE一个通过java串口通信控制LED显示数据的实例

在很多应用程序中都需要用到pc机与外部设备如:嵌入式系统、传感器、开关设备等进行数据通讯。其中,最常用的接口就是RS-232串口和并口。SUN的CommAPI分别提供了对常用的RS232串行端口和IE...
  • ly20wy
  • ly20wy
  • 2013年12月11日 15:25
  • 669

Java实现串口数据读写

最近的一个项目中需要将扫码枪读取到的数据取出,但是因为扫码枪是用串口传输数据的,比较少见,所以记录一下,当给自己做一个小结,有需要的同学也能参考一下。public class receiveData ...
  • hzschqh
  • hzschqh
  • 2017年05月08日 14:26
  • 214

Java串口通信数据采控设计与实现

  • 2010年08月02日 08:43
  • 252KB
  • 下载

java 读取串口数据(绝对可使用)

  • 2015年01月20日 10:30
  • 7.48MB
  • 下载

Win7环境下Java串口数据读写(RXTX)(转载)

转载自: http://blog.sina.com.cn/s/blog_5ceb51480100rdgw.html    最近在实际项目中,需要Java语言来实现对串口数据的读写操...

用Java语言向串口读写数据的方法

应用软件开发中java 是重要的一个方面,下面介绍用Java语言向串口读写数据的方法: Java对串口通信的支持 常见的Java串口包        SUN的CommAPI分别提供了对常...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java接收串口数据
举报原因:
原因补充:

(最多只允许输入30个字)