1.首先下载相应的jar文件

压缩包包括:RXTXcomm.jar(64位环境)、win32com.dll和javax.comm.properties。
下载地址:https://download.csdn.net/download/mr_yaoziyang/11939205
介绍:RXTXcomm.jar提供了通讯用的java API,win32com.dll提供了供RXTXcomm.jar调用的本地驱动接口,javax.comm.properties是这个驱动的类配置文件

2.拷贝RXTXcomm.jar到<JAVA_HOME>\jre\lib\ext目录下面;

3.拷贝javax.comm.properties到<JAVA_HOME>\jre\lib目录下面;

4.拷贝win32com.dll到<JAVA_HOME>\jre\bin目录下面;

5.封装Rs232Util.java 工具类


import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Enumeration;
import java.util.List;import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.NoSuchPortException;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.UnsupportedCommOperationException;public class Rs232Util {private static Rs232Util rs232Util = null;static {// 在该类被ClassLoader加载时就初始化一个SerialTool对象if (rs232Util == null) {rs232Util = new Rs232Util();}}// 私有化SerialTool类的构造方法,不允许其他类生成SerialTool对象private Rs232Util() {}/*** 获取提供服务的SerialTool对象* * @return rs232Util*/public static Rs232Util getSerialTool() {if (rs232Util == null) {rs232Util = new Rs232Util();}return rs232Util;}/*** 查找所有可用端口* * @return 可用端口名称列表*/public static final ArrayList<String> findPort() {// 获得当前所有可用串口@SuppressWarnings("unchecked")Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();ArrayList<String> portNameList = new ArrayList<String>();// 将可用串口名添加到List并返回该Listwhile (portList.hasMoreElements()) {String portName = portList.nextElement().getName();portNameList.add(portName);}return portNameList;}/*** 打开串口* * @param portName 端口名称* @param baudrate 波特率* @return 串口对象* @throws SerialPortParameterFailure 设置串口参数失败* @throws PortInUseException* @throws NoSuchPortException* @throws NotASerialPort             端口指向设备不是串口类型* @throws NoSuchPort                 没有该端口对应的串口设备* @throws PortInUse                  端口已被占用*/public static final SerialPort openPort(String portName, int baudrate) {// 通过端口名识别端口CommPortIdentifier portIdentifier = null;CommPort commPort = null;try {portIdentifier = CommPortIdentifier.getPortIdentifier(portName);// 打开端口,并给端口名字和一个timeout(打开操作的超时时间)commPort = portIdentifier.open(portName, 5000);} catch (NoSuchPortException e1) {e1.printStackTrace();} catch (PortInUseException e) {e.printStackTrace();}// 判断是不是串口if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;try {// 设置一下串口的波特率,载波位,停止位,校验位serialPort.setSerialPortParams(baudrate, SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {System.out.println("设置串口参数失败!打开串口操作未完成!");}System.out.println("Open " + portName + " sucessfully !");return serialPort;} else {System.out.println("端口号不是串口!");return null;}}/*** 关闭串口* * @param serialport 待关闭的串口对象*/public static void closePort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();serialPort = null;}}/*** 往串口发送数据* * @param serialPort 串口对象* @param order      待发送数据* @throws SendDataToSerialPortFailure        向串口发送数据失败* @throws SerialPortOutputStreamCloseFailure 关闭串口对象的输出流出错*/public static void sendToPort(SerialPort serialPort, byte[] order) {BufferedOutputStream out = null;try {out = new BufferedOutputStream(serialPort.getOutputStream());out.write(order);out.flush();} catch (IOException e) {System.out.println("串口数据发送流关闭失败!");} finally {try {if (out != null) {out.close();out = null;}} catch (IOException e) {System.out.println("串口数据发送流关闭失败!");}}}/*** 从串口读取数据* * @param serialPort 当前已建立连接的SerialPort对象* @return 读取到的数据* @throws ReadDataFromSerialPortFailure     从串口读取数据时出错* @throws SerialPortInputStreamCloseFailure 关闭串口对象输入流出错*/public static byte[] readFromPort(SerialPort serialPort) {InputStream in = null;byte[] bytes = null;try {in = new BufferedInputStream(serialPort.getInputStream());// in = serialPort.getInputStream();int bufflenth = in.available(); // 获取buffer里的数据长度if (bufflenth == 0) {closePort(serialPort);throw new NullPointerException("未返回数据");}
//          System.out.println("获取buffer里的数据长度:::"+bufflenth);while (bufflenth != 0) {bytes = new byte[bufflenth]; // 初始化byte数组为buffer中数据的长度in.read(bytes);bufflenth = in.available();}} catch (IOException e) {System.out.println("读取数据失败!");} finally {try {if (in != null) {in.close();in = null;}} catch (IOException e) {System.out.println("串口数据读取流关闭失败!");}}return bytes;}/*** 16进制转BCD码 发送命令请求* * @param s* @return*/public static byte[] hexStringToByteArray(String s) {int len = s.length();byte[] data = new byte[len / 2];try {for (int i = 0; i < len; i += 2) {data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i + 1), 16));}} catch (Exception e) {}return data;}/*** 字节数组转16进制* * @param bytes* @return*/public static String bytesToHex(byte[] bytes) {StringBuffer sb = new StringBuffer();for (int i = 0; i < bytes.length; i++) {String hex = Integer.toHexString(bytes[i] & 0xFF);if (hex.length() < 2) {sb.append(0);}sb.append(hex);}return sb.toString();}/*** @函数功能: BCD码转为10进制串(阿拉伯数据)* @输入参数: BCD码* @输出结果: 10进制串*/public static String bcd2Str(byte[] bytes) {StringBuffer temp = new StringBuffer(bytes.length * 2);for (int i = 0; i < bytes.length; i++) {temp.append((byte) ((bytes[i] & 0xf0) >>> 4));temp.append((byte) (bytes[i] & 0x0f));}return temp.toString().substring(0, 1).equalsIgnoreCase("0") ? temp.toString().substring(1) : temp.toString();}/*** @函数功能: 10进制串转为BCD码* @输入参数: 10进制串* @输出结果: BCD码*/public static byte[] str2Bcd(String asc) {int len = asc.length();int mod = len % 2;if (mod != 0) {asc = "0" + asc;len = asc.length();}byte abt[] = new byte[len];if (len >= 2) {len = len / 2;}byte bbt[] = new byte[len];abt = asc.getBytes();int j, k;for (int p = 0; p < asc.length() / 2; p++) {if ((abt[2 * p] >= '0') && (abt[2 * p] <= '9')) {j = abt[2 * p] - '0';} else if ((abt[2 * p] >= 'a') && (abt[2 * p] <= 'z')) {j = abt[2 * p] - 'a' + 0x0a;} else {j = abt[2 * p] - 'A' + 0x0a;}if ((abt[2 * p + 1] >= '0') && (abt[2 * p + 1] <= '9')) {k = abt[2 * p + 1] - '0';} else if ((abt[2 * p + 1] >= 'a') && (abt[2 * p + 1] <= 'z')) {k = abt[2 * p + 1] - 'a' + 0x0a;} else {k = abt[2 * p + 1] - 'A' + 0x0a;}int a = (j << 4) + k;byte b = (byte) a;bbt[p] = b;}return bbt;}/*** 把byte转为字符串的bit* * @param b* @return*/public static String byteToBit(byte b) {return "" + (byte) ((b >> 7) & 0x1) + (byte) ((b >> 6) & 0x1) + (byte) ((b >> 5) & 0x1)+ (byte) ((b >> 4) & 0x1) + (byte) ((b >> 3) & 0x1) + (byte) ((b >> 2) & 0x1) + (byte) ((b >> 1) & 0x1)+ (byte) ((b >> 0) & 0x1);}/*** 把bit转为字节 byte* * @param byteStr* @return*/public static byte bitToByte(String byteStr) {int re, len;if (null == byteStr) {return 0;}len = byteStr.length();if (len != 4 && len != 8) {return 0;}if (len == 8) {// 8 bit处理if (byteStr.charAt(0) == '0') {// 正数re = Integer.parseInt(byteStr, 2);} else {// 负数re = Integer.parseInt(byteStr, 2) - 256;}} else {// 4 bit处理re = Integer.parseInt(byteStr, 2);}return (byte) re;}/*** 将字符串转成ASCII* * @param value* @return*/public static String stringToAscii(String value) {StringBuffer sbu = new StringBuffer();char[] chars = value.toCharArray();for (int i = 0; i < chars.length; i++) {if (i != chars.length - 1) {sbu.append((int) chars[i]).append(",");} else {sbu.append((int) chars[i]);}}return sbu.toString();}/*** 将ASCII转成字符串的* * @param value* @return*/public static String asciiToString(String value) {StringBuffer sbu = new StringBuffer();String[] chars = value.split(",");for (int i = 0; i < chars.length; i++) {sbu.append((char) Integer.parseInt(chars[i]));}return sbu.toString();}

java Rs232串口协议通讯相关推荐

  1. java天平数据,java RS232串口通讯(电子天平数据抓取)

    写这篇文章是为了记录RS232串口通讯,当时有个央企项目里需要实现自动抓取RS232串口数据,需要支持主要浏览器:Chrome,Firefox,IE8以上等.看了很多有关rs232的资料和也找了很多方 ...

  2. 利用Java实现串口全双工通讯

    一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系统发送来的查询和控制信息,并将执行结果或查询结果发送回主控系统.本文介绍了一个简单的通过串口实现全 ...

  3. 【Java编程系列】使用Java进行串口SerialPort通讯

    热门系列: [Java编程系列]WebService的使用 [Java编程系列]在Spring MVC中使用工具类调用Service层时,Service类为null如何解决 [Java编程系列]Spr ...

  4. 使用Java进行串口SerialPort通讯

    1.准备工作 在进行串口连接通讯前,必须保证你当前操作电脑上有可用且闲置的串口.因为一般的电脑上只有一个或者两个串口,如COM1或COM2,但大多数情况下,这些串口可能会被其他的程序或者应用所占用,所 ...

  5. java 全双工服务器_利用Java实现串口全双工通讯_JAVA实例教程_IT部落

    本文介绍了一个简单的通过串口实现全双工通讯的Java类库,该类库大大的简化了对串口进行操作的过程 一个嵌入式系统通常需要通过串口与其主控系统进行全双工通讯,譬如一个流水线控制系统需要不断的接受从主控系 ...

  6. java 串口 dtr rts_串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解

    串口(RS232 RS485等)通讯中RTS/CTS,DTR/DSR的含义详解 先贴出缩写的含义: DTR – Data Terminal Ready DSR – Data Set Ready RTS ...

  7. RS232串口通讯的那些事

    串口通讯这件事,说简单吧,2 3 5 三根线搞明白了就ok.说复杂吧,这里边的段子就多了.俺刚参加工作时,主要的工作就是搞这个的.那几年,连接了上百种不同型号的设备. RS232串口通讯程序的开发 基 ...

  8. 了解串口协议,及完成STM32的USART串口通讯程序,并用keil观察波形

    文章目录 前言 一.串口协议 1.RS-232 2.485标准 二.RS-232.485和TTL电平 1.RS-232电平 2.485 3.TTL电平 4.区别 三.USB/TTL转232 1.CH3 ...

  9. 【嵌入式05】串口协议+RS-232、485标准+CH430芯片的“USB/TTL转232”

    文章目录 一.串口协议 (一)串口 (二)串口通信 (三)串口通信协议 二.RS-232标准 三.RS-485标准 四.RS-232.485电平与TTL电平的区别 (一)RS-232与485的区别 ( ...

最新文章

  1. 机器学习成为未来趋势 北美未来将保持最大市场规模
  2. 服务器发送退出状态127,TCP正常建立和关闭的状态变化
  3. python读取excel-Python读取Excel表格
  4. 使用ActionBar实现Tab导航(快速生成Tab样式)
  5. php项目部署lnmp,如何在lnmp环境里,部署多个php项目?
  6. 计算机语言史话论文,【论文节选】自然语言处理发展历史。
  7. 【ES9(2018)】for await...of
  8. 学习云计算学哪种编程语言_您应该学习哪种编程语言?
  9. 通过可视化来了解你的Spark应用程序
  10. 《算法图解》读书笔记(一)
  11. HDFS分布式文件系统知识总结
  12. Java过滤器与拦截器的区别
  13. 在线旅游网站技术讲解
  14. leapftp:425 failed to establish connection解决方法
  15. python夜曲编程_夜曲编程——我毕业了!!!
  16. 刷题——求斐波那契数列的第n项(迭代)
  17. 《富爸爸穷爸爸》读书摘要
  18. linux桌面图标恢复,修复桌面白图标的教程
  19. LVS负载均衡群集—NAT模式实例
  20. python2 x和python3 x_python2.x 和python3.x 哪个比较好?老男孩Python

热门文章

  1. 社交电商都有哪些常见的商业模式?
  2. 使用Logistic回归进行评估分析
  3. apk如何使用腾讯加固
  4. 读 巴林后旗《当换项区只有一辆车时》
  5. 虽迟但到了的JavaScript循环
  6. WinCDEmu-好用的iso制作和模拟软件
  7. “淘宝”的源码在这里!
  8. IIS 绑定多个证书错误解决方法
  9. 技术类公众号分享,看到最后哟!
  10. DSPE-NH2 二硬脂酰基磷脂酰乙醇胺-氨基 DSPE-PEG5K-NH2