首页 > 编程语言 >java串口通信

java串口通信

时间:2023-07-10 19:12:18浏览次数:40  
标签:System java 错误 通信 serialPort SerialPortEvent 串口 oEvent

java串口通信

import java.io.*;
import java.util.*;
import gnu.io.*;

public class SerialTest implements SerialPortEventListener {
    SerialPort serialPort;
    // 串口名称
    private static final String PORT_NAME = "/dev/ttyUSB0";
    // 波特率
    private static final int BAUD_RATE = 9600;

    private InputStream inputStream;
    private OutputStream outputStream;
    private static final int TIME_OUT = 2000;
    private static final int DATA_RATE = 9600;

    public void initialize() {
        CommPortIdentifier portId = null;
        Enumeration portEnum = CommPortIdentifier.getPortIdentifiers();

        // 取得所有可用的串口
        while (portEnum.hasMoreElements()) {
            CommPortIdentifier currPortId = (CommPortIdentifier) portEnum.nextElement();
            if (currPortId.getName().equals(PORT_NAME)) {
                portId = currPortId;
                break;
            }
        }

        if (portId == null) {
            System.out.println("无法找到指定的串口,请检查串口是否正确连接!");
            return;
        }

        try {
            serialPort = (SerialPort) portId.open(this.getClass().getName(),
                    TIME_OUT);

            serialPort.setSerialPortParams(BAUD_RATE,
                    SerialPort.DATABITS_8,
                    SerialPort.STOPBITS_1,
                    SerialPort.PARITY_NONE);

            inputStream = serialPort.getInputStream();
            outputStream = serialPort.getOutputStream();

            serialPort.addEventListener(this);
            serialPort.notifyOnDataAvailable(true);
        } catch (Exception e) {
            System.err.println("串口初始化失败!");
            e.printStackTrace();
        }
    }

    public synchronized void close() {
        if (serialPort != null) {
            serialPort.removeEventListener();
            serialPort.close();
        }
    }

    public synchronized void serialEvent(SerialPortEvent oEvent) {
        if (oEvent.getEventType() == SerialPortEvent.DATA_AVAILABLE) {
            try {
                int available = inputStream.available(); // 读取所有可用的数据
                byte[] chunk = new byte[available];
                inputStream.read(chunk, 0, available); // 读取数据
                System.out.print(new String(chunk)); // 输出数据到控制台
            } catch (Exception e) {
                System.err.println("串口读取失败:" + e);
            }
        } else if (oEvent.getEventType() == SerialPortEvent.OPENED) {
            System.out.println("串口已经打开!");
        } else if (oEvent.getEventType() == SerialPortEvent.CLOSED) {
            System.out.println("串口已经关闭!");
        } else if (oEvent.getEventType() == SerialPortEvent.ERROR_OUTPUT) { // 输出错误信息到控制台
            System.err.println("串口输出错误:" + oEvent.getErrorText()); // getErrorText() 返回错误消息字符串
        } else if (oEvent.getEventType() == SerialPortEvent.ERROR_INPUT) { // 忽略输入错误消息
        } else if (oEvent.getEventType() == SerialPortEvent.ERROR_OUTPUT_OVERFLOW) { // 输出错误消息到控制台并忽略溢出错误(即缓冲区已满,无法写入更多数据)
            System.err.println("串口输出溢出:" + oEvent.getErrorText()); // getErrorText() 返回错误消息字符串 缓冲区溢出错误消息是在缓冲区已满时发送的。这个错误是由于应用程序尝试写入缓冲区而无法写入,因为缓冲区已经满了。此错误通常被视为可忽略的,因为它只是表示应用程序在写入时太慢,没有及时停止写入。忽略此错误消息不会导致任何严重后果。 输入错误消息:事件类型ERROR_INPUT表示从串口读取数据时发生错误。此错误类型是可选项,因此您可以选择忽略它。如果您的应用程序需要从串口读取数据,则应该使用ERROR_INPUT事件类型来捕获和处理输入错误消息。 输出溢出错误消息:事件类型ERROR_OUTPUT_OVERFLOW
        }
} }

 

 

 

 

==========

标签:System,java,错误,通信,serialPort,SerialPortEvent,串口,oEvent
From: https://www.cnblogs.com/herd/p/17542052.html

相关文章

  • JAVA集成velocity实现对已有模板替换(占位符变量)替换
      平时我们如果有一些简单的模板替换需求,比如有个txt文件,或者代码生成模板文件要根据传入的变量替换成具体的值就可以使用这个框架 依赖<dependency><groupId>org.apache.velocity</groupId><artifactId>velocity-engine-core</artifactId>......
  • java类和对象学习总结
    当一个引用赋值为null的时候,就代表这个引用不指向任何的对象引用不能指向引用,只能说引用指向了另一个引用的对象.一个引用不能指向多个对象this引用的学习:代表的是当前对象的引用,每一个成员方法的第一个参数默认是thisthis.year this.month   加上this代表给当前的对象......
  • JavaScript加密:常见加密种类、优缺点和代码示例
    当涉及到JavaScript加密时,有多种加密算法和技术可供选择。下面我将列举一些常见的加密种类、它们的优缺点,并提供一些代码案例作为参考。对称加密算法:对称加密算法使用相同的密钥进行加密和解密。常见的对称加密算法包括AES(AdvancedEncryptionStandard)和DES(DataEncryptionS......
  • Java实现浏览器端大文件分片上传实例
    ​ 上周遇到这样一个问题,客户上传高清视频(1G以上)的时候上传失败。一开始以为是session过期或者文件大小受系统限制,导致的错误。查看了系统的配置文件没有看到文件大小限制,web.xml中seesiontimeout是30,我把它改成了120。但还是不行,有时候10分钟就崩了。同事说,可能是客户这里......
  • 面试进阶齐飞!Github一天万赞的阿里Java系统性能优化有多牛?
    前两天在知乎上看到一个问答,说的是:一个Java程序员具备什么样的素质和能力才可以称得上高级工程师?这个问题也引发了我的一些思考,可能很多人会说,“作为高级工程师,基础得过硬、得熟练掌握一门编程语言、至少看过一个优秀开源项目的源代码、有过高并发/性能优化的工作经验、沟通能力......
  • java判断json格式的方法
    ​  在Java中,您可以使用不同的库来检查和验证JSON。以下是使用两个常用的JSON库(Jackson和Gson)来检查JSON的示例代码:使用Jackson库:importcom.fasterxml.jackson.core.JsonParseException;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.jack......
  • java判断json格式的方法
    ​   在Java中,您可以使用不同的库来检查和验证JSON。以下是使用两个常用的JSON库(Jackson和Gson)来检查JSON的示例代码:使用Jackson库:importcom.fasterxml.jackson.core.JsonParseException;importcom.fasterxml.jackson.databind.JsonNode;importcom.fasterxml.ja......
  • 七月十日Java学习
    今天学习了如何循环的具体使用,并学习了如何生成一定范围的随机数。    ......
  • M1芯片Macbookpro 卸载 Java jdk
    M1芯片Macbookpro卸载Javajdk1.进入目录查看jdk环境cd/Library/Java/JavaVirtualMachinesls2.删除jdksudorm-rf/Library/Java/JavaVirtualMachines/jdk环境sudorm-rf/Library/Java/JavaVirtualMachines/jdk1.8.0_202.jdksudorm-rf/Library/Java/JavaVir......
  • Java 中怎样将 bytes 转换为 long 类型?
     将bytes转换为long类型:第一种方式:String接收bytes的构造器转成String,再Long.parseLong;但此种情况需要注意:字节数组中的每个字节都必须是有效的数字字符。如果字节数组包含非数字字符,则会引发NumberFormatException异常。确保在调用Long.parseLong......