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
    评论
### 回答1: Java提供了SerialPort类来与串口进行通信,实现串口接收数据的方法如下: 首先需要打开串口并设置参数,例如: SerialPort serialPort = (SerialPort) portIdentifier.open("串口名称", 2000); serialPort.setSerialPortParams(波特率, 数据位, 停止位, 校验位); 接着,创建一个SerialPortEventListener监听器,用来监听串口接收到的数据。编写一个实现SerialPortEventListener接口的类,并重写其serialEvent方法,例如: class MySerialPortEventListener implements SerialPortEventListener { public void serialEvent(SerialPortEvent event) { if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) { try { byte[] buffer = new byte[inputStream.available()]; inputStream.read(buffer); String message = new String(buffer); // 对收到的数据进行处理 } catch (IOException e) { e.printStackTrace(); } } } } 最后,将监听器添加到串口上,并打开串口的输入流: serialPort.addEventListener(new MySerialPortEventListener()); serialPort.notifyOnDataAvailable(true); inputStream = serialPort.getInputStream(); 这样就可以实现串口接收数据的功能了。在MySerialPortEventListener类的serialEvent方法中,可以对接收到的数据进行处理,例如解析数据包、过滤无用信息等等。 ### 回答2: Java串口接收数据需要使用JavaComm API,需要安装相应的驱动程序和串口通讯库。在Java程序中新建串口对象,设置参数如波特率、数据位、停止位等等,然后开启串口并监听串口事件。 当串口收到数据时,程序会回调serialEvent方法,可以在该方法中读取串口数据并进行处理。读取数据时可以使用InputStream或者BufferedReader对象,需要注意的是读取的数据是字节流,需要进行类型转换。 接收数据后,可以进行数据的解析和处理,例如将数据进行显示、保存、上传等等。如果有多个串口需要处理,可以通过多线程的方式同时监听多个串口,以提高程序的效率。 ### 回答3: Java串口接收数据需要通过Java串口通讯库来实现,常用的有RXTX和JavaComm。其中,RXTX支持多平台,JavaComm只支持Windows平台。接收数据过程主要通过以下步骤实现: 1. 打开串口。通过SerialPort类打开串口,设置波特率、数据位、校验位等参数。 2. 接收数据。在串口打开的情况下,通过InputStream类接收串口数据,将数据存入缓存区中。 3. 处理数据数据存入缓存区后,通过读取缓存区中的字节数据,对数据进行解析和处理,如进行数据转换、过滤无效数据等。 4. 关闭串口数据接收完成后,通过SerialPort类关闭串口,释放资源。 在接收数据过程中,需要注意一些问题。例如,在读取缓存区数据时,要考虑到读取数据时的字节长度和数据类型的匹配,避免出现异常。在处理数据时,需要对数据进行合法性校验,避免出现错误结果。此外,在关闭串口时,也需要注意释放所有资源,避免出现资源泄漏的问题。 Java串口接收数据是一项相对复杂的技术,需要开发者具备一定的Java编程基础和串口通讯技术的知识。对于初学者而言,可以先从相关的文献和教程入手,从简单到复杂,逐步深入学习。通过实际的练习和实践,积累经验,逐渐提高技术水平。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值