【IntelliJ IDEA 2019.2】java读取发送pc串口数据

1.先加好三个包。

http://download.csdn.net/download/baidu_30541191/9383178

注意:可以先不放这3个包,等到编译运行出错后,再根据提示放到相应目录即可。

下载解决后得到3个包

rxtxParallel.dll
rxtxSerial.dll
放到可被搜索的目录下,例如:

RXTXcomm.jar (这一步可以省掉)
放到C:\Program Files\Java\jre1.8.0_202\lib\ext

 

2.建一个测试工程

a.先建立一个普通的默认工程。

b.新建一个lib文件夹,放入RXTXcomm.jar,工程目录里就会自动出现该文件,再右键选择“add as library”

就会变成

根据上图,把库加入到代码里,

import gnu.io.*;

然后就可以使用库里的方法或函数了。

问题1:没有主清单属性

解决方法:那是因为误操作,点成了, 点运行工程即可,不能运行jar包。

问题2:包路径没加对

解决方法:那就把那两个dll文件找到提示的目录之一即可。

问题3:加错32位的dll.

解决方法:下载64位的dll.

测试代码如下:

import javax.print.DocFlavor;
import java.util.ArrayList;

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

public class Test {
    public static void main(String[] args) {
        System.out.printf("*****************\n");
        for (String tmp:FindPort()){
            System.out.println(tmp);
        }
        System.out.printf("----- End -----\n");
    }

    public static final ArrayList<String> FindPort(){
        Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();//获得所有串口
        ArrayList<String> PortNameList = new ArrayList<>();
        //串口名字添加到List并返回
        while (portList.hasMoreElements()) {
            String portName = portList.nextElement().getName();
            PortNameList.add(portName);
        }
        return PortNameList;
    }
}

运行结果如下:

可以显示当前可用的串口。

3.写完整工程

 

网上找的,一放进去就可以编译运行的很精简到只有两个文件的例程:

《java串口通讯传输信息+串口助手模拟》https://download.csdn.net/download/qq_38150996/9856447

 

下载下来就可以编译进行,还带UI的工程:

《JAVA串口调试助手RXTX 源码》https://download.csdn.net/download/u010050187/7390833

 

自已写的代码见附录,可惜,无论是自已写的,还是网上找的,都会遇到以下问题:

问题点:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000180005b00, pid=8432, tid=12608
#
# JRE version: Java(TM) SE Runtime Environment (13.0.1+9) (build 13.0.1+9)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (13.0.1+9, mixed mode, sharing, tiered, compressed oops, g1 gc, windows-amd64)
# Problematic frame:
# C  [rxtxSerial.dll+0x5b00]

解决方法:推测是dll文件出问题了。有点遗憾,最后还是没调通,不过,由于很少有人用JAVA来调串口工具,所以,这个DLL库估计很久没人维护了,在我的win10-64bit电脑上运行失败,也在情理之中。

 

附录1:自已写的代码

Test.java


import java.awt.*;
import java.io.*;
import java.util.*;
import java.util.concurrent.TimeUnit;

import gnu.io.*;

//public class SerialPortDao implements Runnable, SerialPortEventListener {
public class Test {
    private static boolean isOpen=false;
    static Set<CommPortIdentifier> portList=new HashSet<CommPortIdentifier>();
    final static String appName="MyApp";
    private static InputStream is;
    private static OutputStream os;
    private static SerialPort serialPort;
    static byte[] readBuffer=new byte[1024];

    public static void main(String[] args) {
        System.out.printf("*****************\n");

        Set<CommPortIdentifier> ListTmp = getPortList();
        for (CommPortIdentifier portIp:ListTmp) {
            String strPort = portIp.getName();
            System.out.println(strPort);
            if (strPort.equals("COM10")) {
                if (openSerialPort(portIp, 1000)) {
                    System.out.printf("Opend %s Success.\n", strPort);
                    while (true) {
                        sendMessage("ATZ\r");
                        delay_ms(1000);
                        //uartReceiveDatafromSingleChipMachine(serialPort);
                        //serialEvent(serialPort);

                        try {
                            //获取data buffer数据长度
                            int bufferLength = is.available();
                           // System.out.println(bufferLength);
                            if (bufferLength > 0) {
                                is.read();
                               // delay_ms(100);
                            }
                        } catch (Exception e){

                        }

                    }
                } else {
                    System.out.printf("Error: Opend %s Failed!!!\n", strPort);
                }
            }
        }

        System.out.printf("----- End -----\n");
    }

    public static void delay_ms(int nms){
        try {
            Robot r = new Robot();
            r.delay(nms);
        } catch (Exception e) {
        }
    }

    public static Set<CommPortIdentifier> getPortList(){
        /*不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。
         * 注意这里的端口不仅仅是指串口,也包括并口。
         * 这个方法还可以带参数。
         * getPortIdentifiers(CommPort)获得与已经被应用程序打开的端口相对应的CommPortIdentifier对象。
         * getPortIdentifier(String portName)获取指定端口名(比如“COM1”)的CommPortIdentifier对象。
         */
        Enumeration tempPortList=CommPortIdentifier.getPortIdentifiers(); //枚举类
        while(tempPortList.hasMoreElements()){
            //在这里可以调用getPortType方法返回端口类型,串口为CommPortIdentifier.PORT_SERIAL
            CommPortIdentifier portIp = (CommPortIdentifier) tempPortList.nextElement();
            portList.add(portIp);
        }
        return portList;
    }

    public static boolean openSerialPort(CommPortIdentifier portIp,int delay){
        try {
            serialPort=(SerialPort) portIp.open(appName, delay);
            /* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。
             * 如果端口正被其他应用程序占用,将使用 CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。
             * 每个端口都关联一个 InputStream 和一个OutputStream。
             * 如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据流对象,除非有close 被调用。
             * 有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。
             */
        } catch (PortInUseException e) {
            return false;
        }
        try {
            is=serialPort.getInputStream();/*获取端口的输入流对象*/
            os=serialPort.getOutputStream();/*获取端口的输出流对象*/
        } catch (IOException e) {
            return false;
        }
        //try {
            //serialPort.addEventListener(this);/*注册一个SerialPortEventListener事件来监听串口事件*/
        //} catch (TooManyListenersException e) {
        //    return false;
       // }
        serialPort.notifyOnDataAvailable(true);/*数据可用*/
        try {
            /*设置串口初始化参数,依次是波特率,数据位,停止位和校验*/
            serialPort.setSerialPortParams(38400, SerialPort.DATABITS_8,SerialPort.STOPBITS_1 , SerialPort.PARITY_NONE);
        } catch (UnsupportedCommOperationException e) {
            return false;
        }
        return true;
    }

    public static boolean closeSerialPort(){
        if(isOpen){
            try {
                is.close();
                os.close();
                serialPort.notifyOnDataAvailable(false);
                serialPort.removeEventListener();
                serialPort.close();
                isOpen = false;
            } catch (IOException e) {
                return false;
            }
        }
        return true;
    }

    public static boolean sendMessage(String message){
        try {
            System.out.println(message);
            os.write(message.getBytes());
        } catch (IOException e) {
            return false;
        }
        return true;
    }

    /**
     * 从串口读取数据
     * @param serialPort 当前已建立连接的SerialPort对象
     * @return 读取到的数据
     * @throws ReadDataFromSerialPortFailure 从串口读取数据时出错
     * @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错
     */
    public static byte[] readFromPort(SerialPort serialPort) {

        InputStream in = null;
        byte[] bytes = null;

        try {

            in = serialPort.getInputStream();
            int bufflenth = in.available();        //获取buffer里的数据长度

            while (bufflenth != 0) {
                bytes = new byte[bufflenth];    //初始化byte数组为buffer中数据的长度
                in.read(bytes);
                bufflenth = in.available();
            }
        } catch (IOException e) {
            //throw new ReadDataFromSerialPortFailure();
        } finally {
            try {
                if (in != null) {
                    in.close();
                    in = null;
                }
            } catch(IOException e) {
                //throw new SerialPortInputStreamCloseFailure();
            }

        }

        return bytes;

    }

    public void serialEvent(SerialPortEvent event) {
        /*
         * 此处省略一下事件,可酌情添加
         *  SerialPortEvent.BI:/*Break interrupt,通讯中断
         *  SerialPortEvent.OE:/*Overrun error,溢位错误
         *  SerialPortEvent.FE:/*Framing error,传帧错误
         *  SerialPortEvent.PE:/*Parity error,校验错误
         *  SerialPortEvent.CD:/*Carrier detect,载波检测
         *  SerialPortEvent.CTS:/*Clear to send,清除发送
         *  SerialPortEvent.DSR:/*Data set ready,数据设备就绪
         *  SerialPortEvent.RI:/*Ring indicator,响铃指示
         *  SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空
         */
        System.out.println("eve");
        if(event.getEventType()==SerialPortEvent.DATA_AVAILABLE){
            /*Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端*/
            try {
                while(is.available()>0){
                    is.read(readBuffer);//收到的数据再此,可视情况处理
                    System.out.println(readBuffer);
                }
                //SPCommandDao.startDoMessage(new String (readBuffer));//这一句是我的自定义类,处理接受到的信息,可删除
            } catch (IOException e) {
            }
        }
    }

    /*
     * 上位机接收数据
     * 串口对象seriesPort
     * 接收数据buffer
     * 返回一个byte数组
     */
    public  static  byte[] uartReceiveDatafromSingleChipMachine(SerialPort serialPort)
    {
        byte[] receiveDataPackage=null;
        InputStream in=null;
        try
        {
            in=serialPort.getInputStream();
            //获取data buffer数据长度
            int bufferLength=in.available();
            System.out.println(bufferLength);
            //while(bufferLength!=0)
            if (bufferLength > 0)
            {
                //receiveDataPackage=new byte[bufferLength];
          //      in.read();
         //       in.read(receiveDataPackage);
         //       bufferLength=in.available();



            }
        }
        catch (IOException e)
        {
           // e.printStackTrace();
        }
        return receiveDataPackage;
    }

    public static void run() {
        try {
            Thread.sleep(50);//每次收发数据完毕后线程暂停50ms
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

}


 

  • 2
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: 很高兴为您提供史上最详细的IntelliJ IDEA 2019.2安装与配置教程: 1. 下载IntelliJ IDEA 2019.2安装包,可以从官网或其他可靠的下载站点下载。 2. 安装IntelliJ IDEA 2019.2,双击安装包,按照提示进行安装。 3. 打开IntelliJ IDEA 2019.2,选择“Configure”菜单,然后选择“Settings”。 4. 在“Settings”窗口中,选择“Appearance & Behavior”选项卡,然后选择“Appearance”。 5. 在“Appearance”选项卡中,选择您喜欢的主题和字体。 6. 在“Settings”窗口中,选择“Editor”选项卡,然后选择“General”。 7. 在“General”选项卡中,设置您的代码风格和缩进选项。 8. 在“Settings”窗口中,选择“Plugins”选项卡,然后选择“Marketplace”。 9. 在“Marketplace”选项卡中,搜索您需要的插件,然后安装它们。 10. 在“Settings”窗口中,选择“Build, Execution, Deployment”选项卡,然后选择“Build Tools”。 11. 在“Build Tools”选项卡中,选择您使用的构建工具,例如Maven或Gradle。 12. 在“Settings”窗口中,选择“Version Control”选项卡,然后选择您使用的版本控制系统,例如Git或SVN。 13. 在“Settings”窗口中,选择“Languages & Frameworks”选项卡,然后选择您使用的编程语言和框架。 14. 在“Settings”窗口中,选择“Debugger”选项卡,然后选择您需要的调试器选项。 15. 在“Settings”窗口中,选择“Keymap”选项卡,然后设置您的快捷键。 16. 完成所有设置后,单击“Apply”按钮,然后单击“OK”按钮。 以上就是IntelliJ IDEA 2019.2安装与配置的详细教程,希望对您有所帮助。 ### 回答2: Intellij IDEAJava开发领域的著名的IDE(集成开发环境),我们常在Java开发中使用。它的主要功能包括代码编辑、重构、内置版本控制功能(如Git、SVN等),还有各种高效的代码自动补全、代码分析工具等等。而最新的Intellij IDEA 2019.2正式版已经发布,本文将简单介绍它的安装与配置过程。 (一)下载Intellij IDEA安装包 首先,你需要访问Intellij IDEA的官方网站(https://www.jetbrains.com/idea/)下载最新版的 .exe 或者 .dmg 安装包进行安装。然后运行该安装程序,在选择安装路径时,建议安装在C盘。 (二)安装JDK Intellij IDEA是运行在JDK上的,所以在安装前需要先安装JDK,我们可以到官网(https://www.oracle.com/java/technologies/javase-downloads.html)下载JDK。根据自己的操作系统下载对应版本的JDK,这里以Windows为例。 安装JDK时,需要勾选系统路径选项。 (三)安装完成,启动Intellij IDEA 安装完成后,我们启动Intellij IDEA并点击主屏幕上的Create New Project按钮开始创建新的项目。 (四)配置Intellij IDEAIntellij IDEA的主界面左下方,点击Configure按钮弹出如下图所示的配置菜单。在这里,我们可以选择添加我们需要的配置。 这些配置的意义如下: • Google Java Format - 用于格式化Java代码。 • Key Promoter X - 用于建议键盘快捷键改善你的工作效率。 • Codota - 用于自动代码提示和学习。 • Vim - 为使用Vim键绑定的Intellij IDEA用户提供了许多Vim功能。 (五)创建第一个Java项目 在Intellij IDEA的主界面,点击Create New Project按钮,选择Java类型的项目。在创建的过程中,需要设置项目名称、项目的存储路径,配置JDK等项。 (六)安装插件 1、打开Intellij IDEA后,点击 File --> Settings 就会打开设置界面。在界面的左侧边,有一个Plugins选项,我们便在这里选择和搜索想要安装的插件。 2、我们可以在Welcome界面点击Configure ---> Plugins 目录来进入插件页面,进入这个页面后,就可以搜索我们需要的插件,点击Install按钮即可安装。 3、其中我比较常使用的插件是Maven support:该插件主要是简化Intellij IDEA 使用Maven 的配置。如果你正在开发Java项目,那么使用Maven就是一种不错的选择。 总结: 本文详细介绍了Intellij IDEA 2019.2的安装与配置过程。如果你刚开始使用Intellij IDEA,可以按照上述步骤安装并配置一下,一定会使你的开发效率更高。同时,也感性体验到了Intellij IDEA在代码编辑、重构、版本管理等方面的强大功能,相信可以为你的开发工作带来更多的便捷性和高效性。 ### 回答3: IntelliJ IDEA 是一款综合性的 Java 开发 IDE 工具,被开发者广泛应用于 Java 开发、Web 开发和 Android 开发等领域。而在 2019 年 8 月,IntelliJ IDEA 更新了它的 2019.2 版本,带来了更多的功能和提升。下面我们就来一步一步的看看如何安装和配置 IntelliJ IDEA 2019.2。 1. 下载 Intellij IDEA 2019.2 操作系统支持 Windows、_macOS 和 Linux,你可以直接在官网下方选择合适的操作系统版本来进行下载。 2. 安装 IntelliJ IDEA 2019.2 Windows 系统:双击下载的EXE文件,根据提示选择安装位置,然后在安装向导完成之后打开软件即可。在第一次启动软件时,需要进行一些安装的设置。你可以选择要安装的插件和主题以及注册 JetBrains 账号。 MAC 系统:下载后将文件拖到安装文件夹中,然后双击安装程序,根据提示一步步安装。 Linux 系统:下载已经打包好的压缩包并解压,点击 bin 目录下的 idea.sh 启动 IntelliJ IDEA。在第一次启动软件时,需要进行一些安装的设置。你可以选择要安装的插件和主题以及注册 JetBrains 账号。 3. 配置 IntelliJ IDEA 2019.2 (1)设置 JDK 环境 在 IntelliJ IDEA 中使用 Java 开发应用程序,需要配置并使用 JDK 环境。在 “File” 菜单中点击 “Project Structure” 选项,通过点击 “SDKs” 选项卡来添加或删除 JDK。 (2)设置项目结构 在 IntelliJ IDEA 中创建新的项目可以使用 Maven 或 Gradle 来管理,并且可以支持多种语言以及框架。 (3)设置开发者自己的快捷键 在 IntelliJ IDEA 中,可以通过点击 “Preferences” 菜单项进入设置页面,选择 “Keymap” 来设置开发人员的快捷键。 (4)安装插件 在 IntelliJ IDEA 中可以安装插件以扩展其功能。在 IntelliJ IDEA 的官网上,有很多插件资源可以供开发者选择。可以通过 “File” 菜单中的 “Settings” “Plugins” 来安装或卸载插件。安装插件时,可以直接搜索安装。 通过上述步骤,你已经可以成功的安装和配置 IntelliJ IDEA 2019.2 开发 IDE 工具,快来使用它来开发出更加强大的应用程序吧!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值