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_SERIALCommPortIdentifier 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();}}}

【IntelliJ IDEA 2019.2】java读取发送pc串口数据相关推荐

  1. Java读取和解析Excel数据:基于Apache POI(二)

    Java读取和解析Excel数据:基于Apache POI(二) 假设附录1文章中的test.xls是对员工的考勤记录表.需要根据这张excel表统计员工的加班时间,那么需要重点关注第五列的下班时候的 ...

  2. 关于python读取Arduino发送的串口数据将bytes转换为str问题

    关于python读取Arduino发送的串口数据将bytes转换为str问题 Arduino作为一款非常好的开源软件,在控制领域十分受欢迎.最近在做一件事就是将Arduino的数据通过串口传输到电脑, ...

  3. jy61 树莓派_用Linux树莓派来读取JY61的串口数据

    简述 有很多的小伙伴说用Linux树莓派来读取JY61的串口数据不知道怎么操作.今天我和大家分享下我是从三个方面分享的.1.JY61和树莓派的连接方式及VNC的使用:2.下载到树莓派的程序是如何编写的 ...

  4. 如何用Java读取单元格的数据_Java读取Excel中的单元格数据

    目前网上能找到Web平台下的读取Excel表格中数据的两种比较好的方案:PageOffice好用开发效率高:POI免费.供大家参考,针对具体情况选择具体方案. 1. PageOffice读取excel ...

  5. java读取mdb类型的数据

    1.总体说明 现在java读取mdb数据(也就是链接access数据库读取数据)对jdk的版本有要求,jdk1.8以前的可以直接链接access数据 库读取数据,而jdk1.8以后的都需要加载一个连接 ...

  6. kafka消费者参数详解 java读取不到消费者数据

    程序运行中,生产者可以成功生产数据,消费者却一直拿不到存储的数据,运行消费者命令:kafka-console-consumer --bootstrap-server 127.0.0.1:9092 -- ...

  7. 用Java读取pdf中的数据

    用Java简单的读取pdf文件中的数据: 第一步:下载PDFBox-0.7.2.jar.提供一个下载地址:[url]http://pdfhome.hope.com.cn/Resource.aspx?C ...

  8. Java读取Hdfs的文件数据出现乱码的解决方案和办法

    使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...

  9. Java 读取 modbus slave模拟器数据 示例

    1.首先安装modbus slave 模拟器,自己到网上下载破解版的 有注册码 2.新建寄存器 设置单元内数值,点击connection下面的connect,红色的No connection 字样消失 ...

最新文章

  1. 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析
  2. java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?
  3. python网络爬虫_python小知识,基于Python 的网络爬虫技术分析
  4. adb shell命令_[Android]adb的使用
  5. Redis RDB与AOF持久化详解
  6. php的数组排列函数,PHP实现的自定义数组排序函数与排序类示例
  7. final 在java,final 在java中的注意点
  8. 超全面的权限系统设计方案!
  9. IGBT简介、结构及原理
  10. 51单片机最小系统电路图
  11. 阿里靠什么支撑 EB 级计算力?
  12. 【教程】通过lothelper实现短信接收测试
  13. 2019年1月1日之后 你能少缴纳多少个税
  14. word修改后没保存/打开了自动保存没有恢复
  15. 【模型压缩】蒸馏神经网络(Distill the Knowledge in a Neural Network)
  16. Aspose.Cells Excel删除行
  17. HDU 5148 Cities
  18. 《精通Oracle Database 12c SQL PL/SQL编程(第3版)》代码下载
  19. 今天和几个朋友交流个人品牌的看法
  20. Win10+Python+virtualenv 环境配置

热门文章

  1. php nl2p,PHP函数nl2br()与自定义函数nl2p()换行用法分析,nl2brnl2p_PHP教程
  2. request+python : shuold be true判等的问题
  3. 如何去掉德国Kilu免费空间的广告
  4. Oracle ebs r12官方虚拟机配置
  5. 杜笙除镍树脂Tulsimer CH-90实际运用案例
  6. Android实现仿支付宝流水
  7. INSERT插入表记录
  8. 【翻译】WF从入门到精通(第十七章):关联及本地主机通信
  9. golang 格式化占位符相关
  10. 420个生活小窍门,很有用的哦!