Java串口通信(RXTX)

article/2025/10/6 21:28:52

这几天要用到串口通信,而我最会的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;}}

大概就是这样了,关注我,获取更多~


http://chatgpt.dhexx.cn/article/Du8tb5rp.shtml

相关文章

十一、串口通信的基本原理与应用

通常用&#xff1a;SMOD 0&#xff0c;0xfd 利用51单片机的串行接口与上位机建立传输信道进行数据的收发。采用8位UART模式&#xff0c;即模式1&#xff0c;波特率为9600BPS。数据发送采用查询方式&#xff0c;数据接收采用中断方式。 系统上电初始化之后&#xff0c;单片机向…

【超简单的串口通信的工作原理】

下图是电脑收到单片机经过串口发送的信息&#xff0c; 那么电脑是如何与单片机进行串口通信的呢&#xff1f; 首先&#xff0c;任何一种通信都要包括硬件物理接口和软件通信协议。 串口通信物理接口如下图。单片机通过发送端将数据从左往右一位一位按顺序发送&#xff1b;且在…

串口通信基本原理

目录 串口通信连线&#xff1a; 串口通信时序&#xff1a; 起始位&#xff1a; 数据位&#xff1a; 校验位&#xff1a; 停止位&#xff1a; 总结&#xff1a; 串口通信特点&#xff1a; 基于串口的通讯接口&#xff1a; 串口通信连线&#xff1a; 任何通信都要有信息…

一篇短文让你彻底理解什么是串口通信

1 并行与串行通信 机器的通信方式有两种&#xff0c;分别是并行通信与串行通信。 并行通信&#xff1a;并行通信是指多比特数据同时通过并行线进行传送&#xff0c;这样数据传送速度大大提高&#xff0c;但并行传送的线路长度受到限制&#xff0c;因为长度增加&#xff0c;干…

Java RXTX 实现串口通信

目录 串口&#xff08;通信&#xff09;概述 串口调试助手 RXTX 下载与依赖 Java 开发实战 串口(通信)概述 1、串口通信是指串口按位&#xff08;bit&#xff09;发送和接收字节 2、串口通信可以在使用一根线发送数据的同时用另一根线接收数据 3、串口通信常用的协议包括…

串口通信原理

并行通信是指数据的各个位用多条数据线同时进行传输 优点&#xff1a;传输速度快 缺点&#xff1a;占用引脚资源多 串行通信是将数据分成一位一位的形式在一条传输线上逐个传输 优点&#xff1a;通信线路简单、占用引脚资源少 缺点&#xff1a;传输速度慢 同步通信&#xf…

串口通讯基本原理 【详细】

串口通信的基本知识 本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯&#xff0c;RS232,RS485&#xff0c;停止位&#xff0c;奇校验&#xff0c;偶校验 1 串口通讯 串口通讯(Serial Communication)&#xff0c;是指外设和计算…

串口通信的基本原理详解

目录 串口通信 串口通信的两种基本方式 异步数据的数据发送过程 异步通信的数据接收过程 9针串口&#xff08;DB9&#xff09; TTL与RS232区别 TTL: RS232&#xff1a; 串口通信的数据格式 通讯方式 偶校验与奇校验 停止位 波特率&#xff08;波特率就是每秒钟传输…

串口通信原理详解

串口通信是一种串行异步通信&#xff0c;通信双方以字符帧作为数据传输单位&#xff0c;字符帧按位依次传输&#xff0c;每个位占固定的时间长度。两个字符帧之间的传输时间间隔可以是任意的&#xff0c;即传输完一个字符帧之后&#xff0c;可以间隔任意时间再传输下一个字符帧…

14_串口通信原理

通信方式的两种: 并行通讯: 传输原理:数据各个位同时传输。 优点:速度快 缺点:占用引脚资源多 串行通信: 传输原理:数据按位顺序传输。 优点:占用引脚资源少 缺点:速度相对较慢 串行通信: 按照数据传送方向,分为: 单工:数据传输只支持数据在一个方向上传输。 半双工:…

【Linux】基于美信串行解串器实现UART串口通信

文章目录 前言一、环境介绍二、硬件配置1. MAX967632. MAX96752F 三、串口通信协议1. 帧格式2. 同步帧3. 应答帧4. 包格式&#xff08;包由帧组成&#xff09; 四、内核模块实现 前言 车载项目中串行/解串器是十分常见的外设&#xff0c;目前常用的有两种标准&#xff1a;GMSL…

毫米波雷达图解算法原理(基于TI雷达)

毫米波雷达数据处理原理 前言基础bin文件解读 以下我们取1帧进行操作&#xff1a;对数据矩阵进行操作前的转换——开始计算结果矩阵一维FFT&#xff08;距离&#xff09;二维FFT&#xff08;速度&#xff09;角度维FFT &#xff08;假设利用结果已经获取目标&#xff09;对目标…

【阵列信号处理】DOA估计算法

DOA估计中的ESPRIT算法 ESPRIT算法时一种利用子空间旋转法估计DOA参数的方法&#xff0c;其算法的基本思想是将阵列在结构上分成两个完全一致的子列&#xff0c;两个子列相应阵元偏移的距离相等&#xff0c;也就是说阵列的阵元被分成一对对的形式&#xff0c;而且每一对之间具…

Hector SLAM 原理详解、算法解析

目录 1.原理详解 2.算法解析 1.原理详解 Hector整体算法很直接&#xff0c;就是将激光点与已有的地图“对齐”&#xff0c;即扫描匹配。扫描匹配就是使用当前帧与已经有的地图数据构建误差函数&#xff0c;使用高斯牛顿法得到最优解和偏差量。其工作是实现激光点到栅格地图的转…

MPU 6050姿态角度融合算法

1、介绍 1.1 姿态角&#xff08;Euler角&#xff09;pitch yaw roll介绍 飞行器的姿态角并不是指哪个角度&#xff0c;是三个角度的统称。它们是&#xff1a;俯仰、滚转、偏航。你可以想象是飞机围绕XYZ三个轴分别转动形成的夹角。 地面坐标系&#xff08;earth-surface inert…

linemod算法过程理解

一、提取模板 1、预处理 使用高斯模糊预处理将要作为模板的RGB图 2、模板梯度计算 分别计算RGB三个通道中每个像素点x和y方向的梯度&#xff08;sobel算子&#xff09;&#xff0c;取幅值最大的作为该像素的梯度&#xff0c;若梯度幅度值小于阈值&#xff0c;则被舍弃 3、梯度离…

MATLAB函数angle、unwrap

一、angle 相位角 语法 P angle&#xff08;Z&#xff09;描述 P angle&#xff08;Z&#xff09;返回复数数组Z的每个元素的相角&#xff08;以弧度为单位&#xff09;。角度介于π之间。对于复数Z&#xff0c;幅值R和相角theta由下式给出 R 绝对值&#xff08;Z&#xff0…

fbp算法matlab实现,matlab实现fbp算法

matlab提供大量函数,可以方便的完成fbp算法 1)fbp算法原理: 中心切片定理 (CST) : 原数据投影的一维傅立叶变换等于原数据的二维傅立叶变换 投影 --> 一维傅立叶变换 --> 滤波 --> 二维傅立叶反变换 经过上述过程应该得到原始数据 2)投影相关知识 2.1)正投影:对…

一种简单的图形旋转算法

图形旋转好玩又有实用性, 这里介绍一种简单的图形旋转算法. 具体步骤如下: 1. 首先将原图和旋转图的坐标原点都变换到图形的中心位置处. 2. 历遍旋转图形中的每一个pixel, 将pixel的坐标(j,i)反向旋转映射到原图, 得到原图对应的坐标值(Xr,Yr). 3. 考虑到旋转图的尺寸可能大于…

多目标跟踪之数据关联算法——匈牙利算法

零、Track和Detection的cost matrix,distance metric。距离计算的方式有如下几种: 距离cost distance metric,track和detection的距离矩阵。 外观距离appearance distance,来自检测切片ROI的网络特征提取;——余弦距离 运动模型距离 马氏距离,来自检测-跟踪的kalman校正…