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)
        {
        }
    }
}

Java串口编程:串口数据的发送与监听读取

本文的目的是介绍Java串口编程,主要内容包括:1.串口的简单介绍;2.Windows平台下Java串口编程的软硬件环境搭建;3.向串口发送数据以及监听串口并获取其接收到的数据。...
  • u013363811
  • u013363811
  • 2015年03月15日 11:23
  • 19166

使用Java实现串口通信

1.介绍使用Java实现的串口通信程序,支持十六进制数据的发送与接收。 效果图如下: 2.RXTXcommJava串口通信依赖的jar包RXTXcomm.jar 下载地址:http://down...
  • kong_gu_you_lan
  • kong_gu_you_lan
  • 2016年08月24日 17:07
  • 19566

java 读取串口 com 外部设备

/* * To change this template, choose Tools | Templates * and open the template in the editor. ...
  • zhengjianqi
  • zhengjianqi
  • 2012年08月21日 16:43
  • 17282

java通过串口读取数据

最近要做一个项目,接口数据可能通过RS232串口给我们传过来,所以就事先学了一下java如何通过串口接收数据,怕自己忘了,所以记录下来。 java操作串口是通过RXTX实现的,可以从http://f...
  • asuyunlong
  • asuyunlong
  • 2015年04月14日 18:11
  • 752

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

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

通过JAVA读取串口信息

使用JAVA语言通过串口读取串口信息因为毕业设计的需要,前两天通过在网上搜索资料简单学习了一下,现将学习的内容分享给大家。 说明:使用JAVA进行串口通讯一般有两种:第一种,使用sun公司提供的com...
  • m0_37487097
  • m0_37487097
  • 2017年04月24日 17:39
  • 250

java 串口数据的读取,并可通过网页显示获取的数据

  • 2013年04月29日 17:44
  • 17.17MB
  • 下载

java 串口通信的例子(RXTX)

近期要做一个运行与安卓系统之上,与检测仪器进行串口通信的软件,折腾了好几天,现在整理了一个串口通信的完整例子,引用的是RXTX相关的包: 类结构: SPComm.java:   通信主体 SPCo...
  • zhouyingge1104
  • zhouyingge1104
  • 2015年03月27日 13:49
  • 19143

java串口读取数据(转载)

 如何用Java语言向串口读写数据 串口, RS-232-C(又称EIA RS-232-C,以下简称RS232)是在1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终...
  • huangbin10025
  • huangbin10025
  • 2014年09月25日 16:43
  • 3312

使用java实现串口通信

很老套的代码,但是却费时很久,找到过很多参考代码,但是要不然和本身项目不太符合,要不然就运行不出来,报串口找不到的错误,也还因为jar包整了很久,去各种百度解决办法才真正实现使用java实现串口通信。...
  • AquariusSandy
  • AquariusSandy
  • 2017年07月11日 20:08
  • 873
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java接收串口数据
举报原因:
原因补充:

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