Java串口通信(RXTX)
这几天要用到串口通信,而我最会的Java,所以我就去学了一下怎么用Java进行串口通信
用的jar包是RXTX官网:http://rxtx.qbang.org/
下载地址:http://fizzed.com/oss/rxtx-for-java
下载好Jar包后,首先需要配置,这里我用的Eclipse
Window->Preferences->Java->Build Path->User Library
添加一个库,然后添加RXTX的jar包,下载好在lib目录
然后将Native Library修改为lib目录
配置完成 接下来开始写代码
在项目中添加此Library,AddLibrary->userLibrary 选中刚新建的Library
在这 我奉上我记录的API
gnu.io包CommPortIdentifier类getPortIdentifiers(); 返回一个EnumerationgetPortIdentifiers(String s); 返回一个CommPortIdentifier,通过指定的COM名getName(); 返回当前通讯端口标识符名open(String appName,int timeOut); 返回一个CommPort,通过名称和超时,可强转成SerialPortSerialPort抽象类(串行端口)setSerialPortParams(波特率,数据位,停止位,奇偶效验); 设置串口的参数getInputStream(); 获取输入流getOutputStream(); 获取输出流addEventListener(SerialPortEvent); 给打开的串口添加一个监听notifyOnDataAvailable(boolean); 是否打开监听SerialPortEvent类(串行端口事件)BI Break Interrupt 通讯中断OE Overrun Error 溢位错误FE Framing Error 传帧错误PE Parity Error 效验错误CD Carrier Detect 载波检测CTS Clear To Send 清除发送DSR Data Set Ready 数据设备就绪RI Ring Indicator 响铃指示OUTPUT_BUFFER_EMPTY 输出缓冲区清空DATA_AVAILABLE 端口有可用数据serialEvent(ServialPortEvent); 监听,调用此方法
一个简单的串口通信 --
import java.io.BufferedInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.TooManyListenersException;import com.utils.Protocal;
import com.utils.Serial;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener;
import gnu.io.UnsupportedCommOperationException;public class MyTest implements SerialPortEventListener {//串口private static SerialPort serialPort = null;private static CommPortIdentifier comm = null;private static BufferedInputStream bufferInput;public MyTest() {try {//获取通信端口标识符comm = Serial.getCommPortIdentifierByName("COM1");//打开串口serialPort = (SerialPort) comm.open("Read",2000);//设置串口的参数 波特率 数据位 停止位 奇偶效验serialPort.setSerialPortParams(Serial.getBaudRate(),Serial.getDataBits(),Serial.getStopBits(),Serial.getParity());//如果串口不为空的话 则监听获取信息 否则报错OutputStream output = null;if (serialPort != null) {try {//获取输入输出流bufferInput = new BufferedInputStream(serialPort.getInputStream());output = serialPort.getOutputStream();//添加监听serialPort.addEventListener(this);serialPort.notifyOnDataAvailable(true);//发送数据char[] hex = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};Serial.sendData(output,Protocal.getDataHead(),"52 52 52 01",crc,Protocal.getDataTail());System.out.println(crc);}}}}} catch (TooManyListenersException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}} else {throw new RuntimeException("串口获取失败-serialPort为null");}} catch (NoSuchPortException e) {e.printStackTrace();} catch (PortInUseException e) {e.printStackTrace();} catch (UnsupportedCommOperationException e) {e.printStackTrace();}}public static void main(String[] args) {new MyTest();}/*** -串口的监听*/@Overridepublic void serialEvent(SerialPortEvent ev) {//判断数据类型switch (ev.getEventType()) {//通讯中断 Break Interruptcase SerialPortEvent.BI:System.out.println("BI");break;//溢位错误 Overrun Errorcase SerialPortEvent.OE:System.out.println("OE");break;//传帧错误 Framing Errorcase SerialPortEvent.FE:System.out.println("FE");break;//效验错误 Parity Errorcase SerialPortEvent.PE:System.out.println("PE");break;//载波检测 Carrier Detectcase SerialPortEvent.CD:System.out.println("CD");break;//清除发送 Clear To Sendcase SerialPortEvent.CTS:System.out.println("CTS");break;//数据设备就绪 Data Set Readycase SerialPortEvent.DSR:System.out.println("DSR");break;//响铃指示 Ring Indicatorcase SerialPortEvent.RI:System.out.println("RI");break;//输出缓冲区清空 Output Buffer Emptycase SerialPortEvent.OUTPUT_BUFFER_EMPTY:System.out.println("output");break;//端口有可用数据 Data Availablecase SerialPortEvent.DATA_AVAILABLE://读取数据try {byte[] bytes = null;byte[] tempBytes = new byte[1024];int len = -1;while ((len = bufferInput.read(tempBytes)) != -1) {//将数据写入bytes中 并更改bytes的长度if (bytes != null) {byte[] b = bytes;bytes = new byte[bytes.length + len];for (int i = 0;i < bytes.length;i++) {if (i < len) {bytes[i] = b[i];} else {bytes[i] = tempBytes[i];}}} else {bytes = new byte[len];for (int i = 0;i < bytes.length;i++) {bytes[i] = tempBytes[i];}}}//输出数据System.out.println("字符串形式:"+ new String(bytes));System.out.println("16进制形式:"+ Protocal.switchByteToHexadecimal(bytes));} catch (IOException e) {e.printStackTrace();}break;}}
}
奉上我的两个工具类
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.OutputStream;import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.SerialPort;/*** -串口通讯工具类* @author Shendi**/
public class Serial {private static int baudRate = 19200;//波特率 默认为19200private static int dataBits = SerialPort.DATABITS_8;//数据位 默认为8private static int stopBits = SerialPort.STOPBITS_1;//停止位 默认为1private static int parity = SerialPort.PARITY_NONE;//奇偶效验 默认为无public static int getBaudRate() {return baudRate;}public static void setBaudRate(int baudRate) {Serial.baudRate = baudRate;}public static int getDataBits() {return dataBits;}public static void setDataBits(int dataBits) {Serial.dataBits = dataBits;}public static int getStopBits() {return stopBits;}public static void setStopBits(int stopBits) {Serial.stopBits = stopBits;}public static int getParity() {return parity;}public static void setParity(int parity) {Serial.parity = parity;}/*** -获取通信端口标识符通过端口名* @param commName 端口名* @return 实例通讯端口标识符* @throws NoSuchPortException */public static CommPortIdentifier getCommPortIdentifierByName(String commName) throws NoSuchPortException {//如果名称为空 则返回nullif ("".equals(commName)) {return null;}CommPortIdentifier comm = CommPortIdentifier.getPortIdentifier(commName);return comm;}/*** -发送数据* @param serialPortOutput 输出流* @param dataHead 数据头* @param data 数据* @param CRC 校验位* @param dataTail 数据尾*/public static void sendData(OutputStream serialPortOutput,String dataHead,String data,String CRC,String dataTail) {//组合字符串 数据头+数据+校验位+数据尾StringBuffer str = new StringBuffer();if (dataHead != null) {str.append(dataHead);}if (data != null) {str.append(data);}if (CRC != null) {str.append(CRC);}if (dataTail != null) {str.append(dataTail);}System.out.println(str.toString());//将字符串变成16进制存进byte中byte[] bytes = Protocal.switchStringToHexadecimal(str.toString());//发送数据try {serialPortOutput.write(bytes);} catch (IOException e) {e.printStackTrace();}}}
-----------------------------------------------------
import javax.xml.bind.annotation.adapters.HexBinaryAdapter;/*** -协议工具类* @author Shendi**/
public class Protocal {//数据头 数据尾private static String dataHead = "7B 01 00 16 31 33 39 31 34 30 30 30 31 37 39 42 42 42 42 42 42 42 42 42 53";private static String dataTail = "45";private static String CRC = "40 55 ";//CRC效验码 默认为 40 55/*** -将字符串转换为byte数组 16进制* @param str 要转换的字符串* @return 如果为null 则转换失败 否则返回byte数组*/public static byte[] switchStringToHexadecimal(String str) {//将空格清除str = str.replaceAll(" ","");//将字符串按照2个一组拆分 存入byte中byte[] bytes = new byte[str.length()/2];for (int i = 0;i < bytes.length;i++) {bytes[i] = (byte) Integer.parseInt(str.substring(i+i, i+i+2),16);System.out.print(bytes[i]+" ");}System.out.println("\n");return bytes;}public static String switchByteToHexadecimal(byte[] bytes) {StringBuffer data = new StringBuffer();char[] hex = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};for (int i = 0;i < bytes.length;i++) {int num = bytes[i];String str = "";if (num == 0) {str = "00";} else {while (num != 0) {str = hex[num % 16]+str;num /= 16;}}//如果字符串长度不等于2的话 则添加一位0if (str.length() < 2) {str = "0"+str;}//获取16进制data.append(str+" ");}return data.toString();}public static String getDataHead() {return dataHead;}public static String getDataTail() {return dataTail;}public static String getCRC() {return CRC;}}
大概就是这样了,关注我,获取更多~
Java串口通信(RXTX)相关推荐
- Java串口通信详解(转)
Java串口通信详解(转) 作者:denimcc 日期:2007-05-11 序言 说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够 ...
- Java串口通信报错# Problematic frame: # C [rxtxSerial.dll+0x4465](含详细解决流程)
背景:在win10x64,myEclipse软件中移植他人的Java串口通信项目到自己电脑上时报错 问题:在GUI界面上点击"连接"按钮,GUI界面闪退,并在myEclipse软件 ...
- Java串口通信-JSerialComm
Java串口通信-JSerialComm 目前网上的Java串口通信主要使用RXTXComm,但是这个库已经很久没有更新(最近的更新似乎在2012年),并且与JavaFX集成打包时会出现BUG.JSe ...
- java linux 串口_Linux Java 串口通信 | 学步园
费了好大的劲搞定Linux系统上用Java写串口通信的问题. jdk中没有原生的串口api,网上找了半天的资料,大概知道了:Linux系统上用Java写串口程序,有两个包比较常用,一个是当年sun官方 ...
- Java串口通信具体解释
序言 说到开源,恐怕非常少有人不挑大指称赞.学生通过开源码学到了知识,程序猿通过开源类库获得了别人的成功经验及可以按时完毕手头的project,商家通过开源软件赚到了钱--,总之是皆大欢喜.然而开源软 ...
- java调用c 串口_基于C语言的java串口通信程序
目录 1.前言 2.windows 串口通信API 3.C/C++封装 动态运行库 4.JAVA-JNI java程序调用C++程序 一.前言 &ensp ;写这个博客主要是因为自己想用 ...
- Java串口通信详解
序言 说到开源,恐怕很少有人不挑大指称赞.学生通过开源代码学到了知识,程序员通过开源类库获得了别人的成功经验及能够按时完成手头的工程,商家通过开源软件赚到了钱--,总之是皆大欢喜.然而开源软件或类库的 ...
- java串口通信DataRecive_串口通信之DataReceive事件触发时机
环境:Windows PC.本机虚拟COM2连接COM3.串口调试助手COM2发数据 图1 1> ReceivedBytesThreshold为默认值1:2> 一次发送41个字节:3> ...
- java 串口 rxtx_【Java】基于RXTX的Java串口通信
public classSerialPortManager {/*** 查找可用端口 * *@return可用端口名称列表*/ public static final ListfindPorts() ...
- JAVA 串口通信 并口通信
https://www.cnblogs.com/Dreamer-1/p/5523046.html http://rxtx.qbang.org/wiki/index.php/Parallel_Commu ...
最新文章
- 阿里云 OSS+CDN
- AWS — AWS Outposts
- 010 Editor v8.0.1_x32分析以及注册机制作
- xposed 修改参数_【Android 原创】2020春节红包第三题Xposed框架Hook的应用
- Fragment 源码解析add()和replace()方法
- Linux连接锐捷校园网客户端
- oracle安装包安装教程,oracle安装教程【搞定方案】
- jquery.nicescroll.min.js滚动条插件的用法
- html 表单坐标,精美form表单css样式
- java格式化日期24小时_Java如何格式化24小时格式的时间?
- python pandas安装不了_python安装pandas问题!python pandas安装教程
- Composition API的优势
- tfs php,TFS的原理及应用
- php 实现游戏开发
- 蓝标智能营销转型之战 ——Oracle Eloqua 市场营销云助力蓝标盈云迎战全渠道营销...
- 两台交换机形成环路!
- 俞敏洪:这是一个创业的大时代
- 教程篇(6.4) 07. 诊断和故障排除 ❀ FortiManager ❀ Fortinet 网络安全专家 NSE 5
- 【sigma 协议】
- html中的开启礼盒的代码,CSS3 蛋糕+生日礼盒打开动效
热门文章
- 宝峰对讲机16频率表_宝峰对讲机频率设置 设置对讲机频率的技巧
- 电容触摸屏测试软件,大规模生产中如何测量触摸屏电容值
- 【音频隐写提取】MP3Stego下载、命令、使用方法
- 单片机仿真软件Proteus Pro 8.9版本License过期
- protues 51单片机仿真电路图及代码
- python使用OpenCV-Python结合百度图像识别api实现图片中的文字识别
- android应用跳文件管理,10款优秀Android文件管理器应用
- MVG基站天线测量系统获盛路通信选用
- 计算机文化基础(高职高专版 第十一版)第六章 答案
- 《统计会犯错——如何避免数据分析中的统计陷阱》导读