【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_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串口数据相关推荐
- Java读取和解析Excel数据:基于Apache POI(二)
Java读取和解析Excel数据:基于Apache POI(二) 假设附录1文章中的test.xls是对员工的考勤记录表.需要根据这张excel表统计员工的加班时间,那么需要重点关注第五列的下班时候的 ...
- 关于python读取Arduino发送的串口数据将bytes转换为str问题
关于python读取Arduino发送的串口数据将bytes转换为str问题 Arduino作为一款非常好的开源软件,在控制领域十分受欢迎.最近在做一件事就是将Arduino的数据通过串口传输到电脑, ...
- jy61 树莓派_用Linux树莓派来读取JY61的串口数据
简述 有很多的小伙伴说用Linux树莓派来读取JY61的串口数据不知道怎么操作.今天我和大家分享下我是从三个方面分享的.1.JY61和树莓派的连接方式及VNC的使用:2.下载到树莓派的程序是如何编写的 ...
- 如何用Java读取单元格的数据_Java读取Excel中的单元格数据
目前网上能找到Web平台下的读取Excel表格中数据的两种比较好的方案:PageOffice好用开发效率高:POI免费.供大家参考,针对具体情况选择具体方案. 1. PageOffice读取excel ...
- java读取mdb类型的数据
1.总体说明 现在java读取mdb数据(也就是链接access数据库读取数据)对jdk的版本有要求,jdk1.8以前的可以直接链接access数据 库读取数据,而jdk1.8以后的都需要加载一个连接 ...
- kafka消费者参数详解 java读取不到消费者数据
程序运行中,生产者可以成功生产数据,消费者却一直拿不到存储的数据,运行消费者命令:kafka-console-consumer --bootstrap-server 127.0.0.1:9092 -- ...
- 用Java读取pdf中的数据
用Java简单的读取pdf文件中的数据: 第一步:下载PDFBox-0.7.2.jar.提供一个下载地址:[url]http://pdfhome.hope.com.cn/Resource.aspx?C ...
- Java读取Hdfs的文件数据出现乱码的解决方案和办法
使用JAVA api读取HDFS文件乱码踩坑 想写一个读取HFDS上的部分文件数据做预览的接口,根据网上的博客实现后,发现有时读取信息会出现乱码,例如读取一个csv时,字符串之间被逗号分割 英文字符串 ...
- Java 读取 modbus slave模拟器数据 示例
1.首先安装modbus slave 模拟器,自己到网上下载破解版的 有注册码 2.新建寄存器 设置单元内数值,点击connection下面的connect,红色的No connection 字样消失 ...
最新文章
- 一致性协议算法-2PC、3PC、Paxos、Raft、ZAB、NWR超详细解析
- java 菜单 分隔符_在Java中使用分隔符连接值列表最优雅的方法是什么?
- python网络爬虫_python小知识,基于Python 的网络爬虫技术分析
- adb shell命令_[Android]adb的使用
- Redis RDB与AOF持久化详解
- php的数组排列函数,PHP实现的自定义数组排序函数与排序类示例
- final 在java,final 在java中的注意点
- 超全面的权限系统设计方案!
- IGBT简介、结构及原理
- 51单片机最小系统电路图
- 阿里靠什么支撑 EB 级计算力?
- 【教程】通过lothelper实现短信接收测试
- 2019年1月1日之后 你能少缴纳多少个税
- word修改后没保存/打开了自动保存没有恢复
- 【模型压缩】蒸馏神经网络(Distill the Knowledge in a Neural Network)
- Aspose.Cells Excel删除行
- HDU 5148 Cities
- 《精通Oracle Database 12c SQL PL/SQL编程(第3版)》代码下载
- 今天和几个朋友交流个人品牌的看法
- Win10+Python+virtualenv 环境配置