java SerialPort串口通讯的使用

api文档

http://fazecast.github.io/jSerialComm/javadoc/com/fazecast/jSerialComm/package-summary.html

 

 maven依赖

<!-- https://mvnrepository.com/artifact/com.fazecast/jSerialComm -->
<dependency>
    <groupId>com.fazecast</groupId>
    <artifactId>jSerialComm</artifactId>
    <!--<version>2.5.2</version>-->
    <version>[2.0.0,3.0.0)</version>
</dependency> 

基于事件的阅读用法示例

可供读取的数据示例

以下示例显示了使用此事件触发器的一种方法:

    SerialPort comPort = SerialPort.getCommPorts()[0];
    comPort.openPort();
    comPort.addDataListener(new SerialPortDataListener() {
        @Override
        public int getListeningEvents() { return SerialPort.LISTENING_EVENT_DATA_AVAILABLE; }
        @Override
        public void serialEvent(SerialPortEvent event)
        {
            if (event.getEventType() != SerialPort.LISTENING_EVENT_DATA_AVAILABLE)
                return;
            byte[] newData = new byte[comPort.bytesAvailable()];
            int numRead = comPort.readBytes(newData, newData.length);
            System.out.println("Read " + numRead + " bytes.");
        }

    });

 

 非阻塞阅读用法示例

package com.bhu.utils;

import com.fazecast.jSerialComm.SerialPort;


public class SerialComm {

    /*public static void main(String[] args) throws InterruptedException {
        SerialComm serialComm = new SerialComm("COM3");
        serialComm.openPort();
        while (true) {
            byte[] bs = serialComm.writeAndRead("010300000002");
            Double[] d = Utils.analysisData(bs, 3, 5, 2);
            if (d != null) {
                for (Double a : d) {
                    System.out.println(a);
                }
            }

            Thread.sleep(1000);
        }
    }*/


    public SerialComm(String portDescriptor) {
        this.portDescriptor = portDescriptor;
    }

    public SerialComm(String portDescriptor, Integer baudRate) {
        this.portDescriptor = portDescriptor;
        this.baudRate = baudRate;
    }

    private String portDescriptor;
    private Integer baudRate;

    private SerialPort comPort;

    public boolean isOpen() {
        return comPort.isOpen();
    }

    /**
     * 打开串口
     *
     * @return 打开的状态
     */
    public boolean openPort() {
        return openPort(portDescriptor, baudRate);
    }

    /**
     * 打开串口
     *
     * @param portDescriptor COM口
     * @return 打开的状态
     */
    public boolean openPort(String portDescriptor) {
        return openPort(portDescriptor, null);
    }

    /**
     * 打开串口
     *
     * @param portDescriptor COM口
     * @param baudRate       波特率
     * @return 打开的状态
     */
    public boolean openPort(String portDescriptor, Integer baudRate) {
        comPort = SerialPort.getCommPort(portDescriptor);
        if (baudRate != null) {
            comPort.setBaudRate(baudRate);
        }
        if (!comPort.isOpen()) {
            return comPort.openPort();
        } else {
            return true;
        }
    }


    /**
     * 关闭串口
     *
     * @return
     */
    public boolean closePort() {
        if (comPort != null && comPort.isOpen()) {
            return comPort.closePort();
        }
        return true;
    }

    /**
     * 向com口发送数据并且读取数据
     */
    public byte[] writeAndRead(String instruct) {
        byte[] reslutData = null;
        try {
            if (!comPort.isOpen()) throw new BhudyException(BhudyExceptionCode.CODE_18);

            int numWrite = comPort.writeBytes(Utils.getCRC(instruct), Utils.getCRC(instruct).length);
            if (numWrite > 0) {
                int i = 0;
                while (comPort.bytesAvailable() > 0 && i++ < 5) Thread.sleep(20);
                byte[] readBuffer = new byte[comPort.bytesAvailable()];
                int numRead = comPort.readBytes(readBuffer, readBuffer.length);
                if (numRead > 0) {
                    reslutData = readBuffer;
                }
            }
        } catch (InterruptedException e) {
            throw new BhudyException(e.getMessage());
        }
        return reslutData;
    }

}
  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 在Java中,可以使用JavaComm API来实现串口通讯。以下是实现串口通讯的基本步骤: 1. 下载并安装JavaComm API,该API包括了访问串的类和方法。 2. 导入JavaComm API库。 ```java import javax.comm.*; ``` 3. 使用CommPortIdentifier类获取可用的串。 ```java Enumeration portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { CommPortIdentifier portId = (CommPortIdentifier) portList.nextElement(); if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { System.out.println(portId.getName()); } } ``` 4. 打开选定的串。 ```java CommPortIdentifier portId = CommPortIdentifier.getPortIdentifier("COM1"); SerialPort serialPort = (SerialPort) portId.open("MyApp", 2000); ``` 5. 配置串参数,例如波特率、数据位、停止位、奇偶校验位等。 ```java serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); ``` 6. 获取输入输出流并进行数据传输。 ```java InputStream in = serialPort.getInputStream(); OutputStream out = serialPort.getOutputStream(); out.write("Hello World".getBytes()); byte[] buffer = new byte[1024]; int len = in.read(buffer); System.out.println(new String(buffer, 0, len)); ``` 7. 关闭串。 ```java serialPort.close(); ``` 以上是Java实现串口通讯的基本步骤,根据具体需求可以进行进一步的修改和扩展。 ### 回答2: Java可以通过使用第三方库来实现串口通讯。其中最常用的库之一是RXTX,它可以在 Java 平台上提供串口通讯的功能。 RXTX是一个开源的串口通讯库,支持跨平台运行。以下是实现串口通讯的一般步骤: 1. 添加RXTX库:首先,你需要下载RXTX库的最新版本。然后,将库的JAR文件添加到你的Java项目的classpath中。 2. 打开串使用RXTX提供的类,打开你要进行通讯的串。你可以选择串的名称、波特率和其他参数。 3. 设置串监听器:通过注册一个监听器来监听串的输入数据。这样,当串接收到数据时,你就可以在监听器中处理它。 4. 发送数据:使用对象的输出流,你可以将数据发送到串设备上。 5. 接收数据:使用对象的输入流,你可以读取从串设备接收到的数据。 6. 关闭串:当你完成通讯后,要记得关闭串,释放资源。 需要注意的是,在使用RXTX库之前,你需要在你的操作系统上安装相应的驱动程序。具体的驱动程序安装方法和操作系统有关。 总结起来,通过使用RXTX库,我们可以在Java平台上实现串口通讯。我们可以打开和关闭串,发送和接收数据。这为与硬件设备的交互提供了便利,例如与传感器、机器人或其他串设备进行通讯。 ### 回答3: 串口通讯Java中可以通过JavaComm API来实现。下面是一个简单的示例来说明如何使用Java实现串口通讯。 1. 首先,我们需要下载并安装Java Comm API。可以从Oracle官方网站上下载相应版本的Java Comm API。 2. 在Java代码中,我们需要导入相应的类,包括javax.comm包中的SerialPortCommPortIdentifier类。 3. 然后,我们需要通过调用CommPortIdentifier类的getPortIdentifiers()方法获取当前系统中可用的串列表。 4. 对于每个可用的串,我们可以调用CommPortIdentifier类的方法来获得串对象。 5. 通过打开串,我们可以得到一个串输入流和一个串输出流。 6. 通过串输出流,我们可以发送数据。通过串输入流,我们可以接收数据。 7. 当需要关闭串时,我们需要调用close()方法来关闭串。 下面是一个简单的示例代码: ``` import javax.comm.*; public class SerialCommunication { public static void main(String[] args) { CommPortIdentifier portId; try { // 获取当前系统中可用的串列表 Enumeration portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) { // 获取串对象 portId = (CommPortIdentifier) portList.nextElement(); // 判断串类型 if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) { // 打开串 SerialPort serialPort = (SerialPort) portId.open("SerialCommunication", 2000); // 配置串参数 serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); // 获取串输入流和输出流 InputStream in = serialPort.getInputStream(); OutputStream out = serialPort.getOutputStream(); // 使用输出流发送数据 out.write("Hello, Serial Port!".getBytes()); out.flush(); // 接收串输入流数据 byte[] buffer = new byte[1024]; int len = in.read(buffer); String receivedData = new String(buffer, 0, len); System.out.println("Received Data: " + receivedData); // 关闭串 serialPort.close(); } } } catch (Exception e) { e.printStackTrace(); } } } ``` 这就是一种基本的方法来实现Java中的串口通讯。当然,还有其他的一些高级应用,比如监听串数据事件等。 希望这个简单的示例可以帮助您理解在Java中如何实现串口通讯

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值