Java串口通信程序(程序及注释) 可编译运行
Java和51单片机串口通信(Java发送数据到单片机,单片机反馈数据到电脑)

Java和51单⽚机串⼝通信(Java发送数据到单⽚机,单⽚机反馈数据到电脑)Java发送字符串到单⽚机,单⽚机返回给电脑----------------------------------------------------------------------------------------------------材料:1. 51单⽚机2. Java客户端3. Keil程序----------------------------------------------------------------------------------------------------⼀、单⽚机程序在Keil中新建⼯程,编写程序,⽣成 .hex ⽂件(这个⽂件可以烧录到单⽚机中)/*串⼝通信:1、由PC机通过串⾏⼝向单⽚机发送数据,这个数据是存放在单⽚机的接收缓冲器SBUF中的;2、单⽚机将串⾏⼝中的数据存放在⼀个临时变量中;3、单⽚机将存放在临时变量中的数据发送到发送缓冲器SBUF中,在PC机上显⽰。
*/#include <reg52.h>#define u16 unsigned int#define u8 unsigned char// 串⾏⼝通信初始化函数void StartInit(){/*1、确定T1的⼯作⽅式(编程TMOD寄存器):因为串⾏⼝中断是由定时器T1决定的,所以,低四位全部为0,⾼四位中,GATE=0,C/T⾮=0,选择⼯作⽅式1(8位的⾃动重装载),即M1M0=10所以是:00100000,转成⼗六进制数是:0x20*/TMOD=0x20;/*2、计算T1的初值,装载TH1、TL1:使⽤⼯具⽣成,设置参数,定时器⽅式:⽅式2;晶振频率:12Mhz;波特率:4800;SMOD:波特率倍增位,1,即增加1倍;计算结果是:F3H所以TH1=0xF3,TL1=0xF3,⾃动重装载*/TH1=0xF3;TL1=0xF3;/*PCON:与串⾏⼝⼯作相关的参数,只有⼀位SMOD(最⾼位),在串⾏⼝⽅式1、⽅式2、⽅式3时,波特率与SMOD有关,当SMOD=1时,波特率提⾼⼀倍。
使用Java实现串口通信

使⽤Java实现串⼝通信本⽂实例为⼤家分享了Java实现串⼝通信的具体代码,供⼤家参考,具体内容如下1.介绍使⽤Java实现的串⼝通信程序,⽀持⼗六进制数据的发送与接收。
源码:效果图如下:2.RXTXcomm内含32位与64位版本使⽤⽅法:拷贝 RXTXcomm.jar 到 JAVA_HOME\jre\lib\ext⽬录中;拷贝 rxtxSerial.dll 到 JAVA_HOME\jre\bin⽬录中;拷贝 rxtxParallel.dll 到 JAVA_HOME\jre\bin⽬录中;JAVA_HOME为jdk安装路径3.串⼝通信管理SerialPortManager实现了对串⼝通信的管理,包括查找可⽤端⼝、打开关闭串⼝、发送接收数据。
package com.yang.serialport.manage;import mPort;import mPortIdentifier;import gnu.io.NoSuchPortException;import gnu.io.PortInUseException;import gnu.io.SerialPort;import gnu.io.SerialPortEventListener;import gnu.io.UnsupportedCommOperationException;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.TooManyListenersException;import com.yang.serialport.exception.NoSuchPort;import com.yang.serialport.exception.NotASerialPort;import com.yang.serialport.exception.PortInUse;import com.yang.serialport.exception.ReadDataFromSerialPortFailure;import com.yang.serialport.exception.SendDataToSerialPortFailure;import com.yang.serialport.exception.SerialPortInputStreamCloseFailure;import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure;import com.yang.serialport.exception.SerialPortParameterFailure;import com.yang.serialport.exception.TooManyListeners;/*** 串⼝管理** @author yangle*/public class SerialPortManager {/*** 查找所有可⽤端⼝** @return 可⽤端⼝名称列表*/@SuppressWarnings("unchecked")public static final ArrayList<String> findPort() {// 获得当前所有可⽤串⼝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 NotASerialPort* 端⼝指向设备不是串⼝类型* @throws NoSuchPort* 没有该端⼝对应的串⼝设备* @throws PortInUse* 端⼝已被占⽤*/public static final SerialPort openPort(String portName, int baudrate) throws SerialPortParameterFailure, NotASerialPort, NoSuchPort, PortInUse {try {// 通过端⼝名识别端⼝CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(portName);// 打开端⼝,设置端⼝名与timeout(打开操作的超时时间)CommPort commPort = portIdentifier.open(portName, 2000);// 判断是不是串⼝if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;try {// 设置串⼝的波特率等参数serialPort.setSerialPortParams(baudrate,SerialPort.DATABITS_8, SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);} catch (UnsupportedCommOperationException e) {throw new SerialPortParameterFailure();}return serialPort;} else {// 不是串⼝throw new NotASerialPort();}} catch (NoSuchPortException e1) {throw new NoSuchPort();} catch (PortInUseException e2) {throw new PortInUse();}}/*** 关闭串⼝** @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) throws SendDataToSerialPortFailure,SerialPortOutputStreamCloseFailure {OutputStream out = null;try {out = serialPort.getOutputStream();out.write(order);out.flush();} catch (IOException e) {throw new SendDataToSerialPortFailure();} finally {try {if (out != null) {out.close();out = null;}} catch (IOException e) {throw new SerialPortOutputStreamCloseFailure();}}}/*** 从串⼝读取数据** @param serialPort* 当前已建⽴连接的SerialPort对象* @return 读取到的数据* @throws ReadDataFromSerialPortFailure* 从串⼝读取数据时出错* @throws SerialPortInputStreamCloseFailure* 关闭串⼝对象输⼊流出错*/public static byte[] readFromPort(SerialPort serialPort)throws ReadDataFromSerialPortFailure,SerialPortInputStreamCloseFailure {InputStream in = null;byte[] bytes = null;try {in = serialPort.getInputStream();// 获取buffer⾥的数据长度int bufflenth = in.available();while (bufflenth != 0) {// 初始化byte数组为buffer中数据的长度bytes = new byte[bufflenth];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;}/*** 添加监听器** @param port* 串⼝对象* @param listener* 串⼝监听器* @throws TooManyListeners* 监听类对象过多*/public static void addListener(SerialPort port,SerialPortEventListener listener) throws TooManyListeners {try {// 给串⼝添加监听器port.addEventListener(listener);// 设置当有数据到达时唤醒监听接收线程port.notifyOnDataAvailable(true);// 设置当通信中断时唤醒中断线程port.notifyOnBreakInterrupt(true);} catch (TooManyListenersException e) {throw new TooManyListeners();}}}4.程序主窗⼝/** MainFrame.java** Created on 2016.8.19*/package com.yang.serialport.ui;import gnu.io.SerialPort;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import java.awt.Color;import java.awt.GraphicsEnvironment;import java.awt.Point;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;import java.util.List;import javax.swing.BorderFactory;import javax.swing.JButton;import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JLabel;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea;import javax.swing.JTextField;import com.yang.serialport.exception.NoSuchPort;import com.yang.serialport.exception.NotASerialPort;import com.yang.serialport.exception.PortInUse;import com.yang.serialport.exception.SendDataToSerialPortFailure; import com.yang.serialport.exception.SerialPortOutputStreamCloseFailure; import com.yang.serialport.exception.SerialPortParameterFailure;import com.yang.serialport.exception.TooManyListeners;import com.yang.serialport.manage.SerialPortManager;import com.yang.serialport.utils.ByteUtils;import com.yang.serialport.utils.ShowUtils;/*** 主界⾯** @author yangle*/public class MainFrame extends JFrame {/*** 程序界⾯宽度*/public static final int WIDTH = 500;/*** 程序界⾯⾼度*/public static final int HEIGHT = 360;private JTextArea dataView = new JTextArea();private JScrollPane scrollDataView = new JScrollPane(dataView);// 串⼝设置⾯板private JPanel serialPortPanel = new JPanel();private JLabel serialPortLabel = new JLabel("串⼝");private JLabel baudrateLabel = new JLabel("波特率");private JComboBox commChoice = new JComboBox();private JComboBox baudrateChoice = new JComboBox();// 操作⾯板private JPanel operatePanel = new JPanel();private JTextField dataInput = new JTextField();private JButton serialPortOperate = new JButton("打开串⼝");private JButton sendData = new JButton("发送数据");private List<String> commList = null;private SerialPort serialport;public MainFrame() {initView();initComponents();actionListener();initData();}private void initView() {// 关闭程序setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); // 禁⽌窗⼝最⼤化setResizable(false);// 设置程序窗⼝居中显⽰Point p = GraphicsEnvironment.getLocalGraphicsEnvironment().getCenterPoint();setBounds(p.x - WIDTH / 2, p.y - HEIGHT / 2, WIDTH, HEIGHT);this.setLayout(null);setTitle("串⼝通讯");}private void initComponents() {// 数据显⽰dataView.setFocusable(false);scrollDataView.setBounds(10, 10, 475, 200);add(scrollDataView);// 串⼝设置serialPortPanel.setBorder(BorderFactory.createTitledBorder("串⼝设置"));serialPortPanel.setBounds(10, 220, 170, 100);serialPortPanel.setLayout(null);add(serialPortPanel);serialPortLabel.setForeground(Color.gray);serialPortLabel.setBounds(10, 25, 40, 20);serialPortPanel.add(serialPortLabel);commChoice.setFocusable(false);commChoice.setBounds(60, 25, 100, 20);serialPortPanel.add(commChoice);baudrateLabel.setForeground(Color.gray);baudrateLabel.setBounds(10, 60, 40, 20);serialPortPanel.add(baudrateLabel);baudrateChoice.setFocusable(false);baudrateChoice.setBounds(60, 60, 100, 20);serialPortPanel.add(baudrateChoice);// 操作operatePanel.setBorder(BorderFactory.createTitledBorder("操作"));operatePanel.setBounds(200, 220, 285, 100);operatePanel.setLayout(null);add(operatePanel);dataInput.setBounds(25, 25, 235, 20);operatePanel.add(dataInput);serialPortOperate.setFocusable(false);serialPortOperate.setBounds(45, 60, 90, 20);operatePanel.add(serialPortOperate);sendData.setFocusable(false);sendData.setBounds(155, 60, 90, 20);operatePanel.add(sendData);}@SuppressWarnings("unchecked")private void initData() {commList = SerialPortManager.findPort();// 检查是否有可⽤串⼝,有则加⼊选项中if (commList == null || commList.size() < 1) {ShowUtils.warningMessage("没有搜索到有效串⼝!");} else {for (String s : commList) {commChoice.addItem(s);}}baudrateChoice.addItem("9600");baudrateChoice.addItem("19200");baudrateChoice.addItem("38400");baudrateChoice.addItem("57600");baudrateChoice.addItem("115200");}private void actionListener() {serialPortOperate.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if ("打开串⼝".equals(serialPortOperate.getText())&& serialport == null) {openSerialPort(e);} else {closeSerialPort(e);}}});sendData.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {sendData(e);}});}/*** 打开串⼝** @param evt* 点击事件*/private void openSerialPort(java.awt.event.ActionEvent evt) {// 获取串⼝名称String commName = (String) commChoice.getSelectedItem();// 获取波特率int baudrate = 9600;String bps = (String) baudrateChoice.getSelectedItem();baudrate = Integer.parseInt(bps);// 检查串⼝名称是否获取正确if (commName == null || commName.equals("")) {ShowUtils.warningMessage("没有搜索到有效串⼝!");} else {try {serialport = SerialPortManager.openPort(commName, baudrate); if (serialport != null) {dataView.setText("串⼝已打开" + "\r\n");serialPortOperate.setText("关闭串⼝");}} catch (SerialPortParameterFailure e) {e.printStackTrace();} catch (NotASerialPort e) {e.printStackTrace();} catch (NoSuchPort e) {e.printStackTrace();} catch (PortInUse e) {e.printStackTrace();ShowUtils.warningMessage("串⼝已被占⽤!");}}try {SerialPortManager.addListener(serialport, new SerialListener()); } catch (TooManyListeners e) {e.printStackTrace();}}/*** 关闭串⼝** @param evt* 点击事件*/private void closeSerialPort(java.awt.event.ActionEvent evt) {SerialPortManager.closePort(serialport);dataView.setText("串⼝已关闭" + "\r\n");serialPortOperate.setText("打开串⼝");}/*** 发送数据** @param evt* 点击事件*/private void sendData(java.awt.event.ActionEvent evt) {// 输⼊框直接输⼊⼗六进制字符,长度必须是偶数String data = dataInput.getText().toString();try {SerialPortManager.sendToPort(serialport,ByteUtils.hexStr2Byte(data));} catch (SendDataToSerialPortFailure e) {e.printStackTrace();} catch (SerialPortOutputStreamCloseFailure e) {e.printStackTrace();}}private class SerialListener implements SerialPortEventListener { /*** 处理监控到的串⼝事件*/public void serialEvent(SerialPortEvent serialPortEvent) {switch (serialPortEvent.getEventType()) {case SerialPortEvent.BI: // 10 通讯中断ShowUtils.errorMessage("与串⼝设备通讯中断");break;case SerialPortEvent.OE: // 7 溢位(溢出)错误case SerialPortEvent.FE: // 9 帧错误case SerialPortEvent.PE: // 8 奇偶校验错误case SerialPortEvent.CD: // 6 载波检测case SerialPortEvent.CTS: // 3 清除待发送数据case SerialPortEvent.DSR: // 4 待发送数据准备好了case SerialPortEvent.RI: // 5 振铃指⽰case SerialPortEvent.OUTPUT_BUFFER_EMPTY: // 2 输出缓冲区已清空break;case SerialPortEvent.DATA_AVAILABLE: // 1 串⼝存在可⽤数据byte[] data = null;try {if (serialport == null) {ShowUtils.errorMessage("串⼝对象为空!监听失败!");} else {// 读取串⼝数据data = SerialPortManager.readFromPort(serialport);dataView.append(ByteUtils.byteArrayToHexString(data,true) + "\r\n");}} catch (Exception e) {ShowUtils.errorMessage(e.toString());// 发⽣读取错误时显⽰错误信息后退出系统System.exit(0);}break;}}}public static void main(String args[]) {java.awt.EventQueue.invokeLater(new Runnable() {public void run() {new MainFrame().setVisible(true);}});}}5.写在最后源码下载地址:欢迎同学们吐槽评论,如果你觉得本篇博客对你有⽤,那么就留个⾔或者顶⼀下吧(^-^)感谢:以上就是本⽂的全部内容,希望对⼤家的学习有所帮助,也希望⼤家多多⽀持。
java串口通讯程序

j a v a串口通讯程序-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIANjava串口通讯程序1、下载java Communications api开发包。
|是Sun公司提供的,用于开发平台独立的通讯应用程序的扩展API。
2、将拷贝入C:\j2sdk1.4.2_04\bin3、将拷贝入C:\j2sdk1.4.2_04\jre\lib\ext4、将拷贝入C:\j2sdk1.4.2_04\jre\lib5、编译文件import .*;import .*;import .*;public class CommTest{public static void main(String[] args){SerialPort serialPort=null;DataOutputStream doutput=null;InputStream inputStream;CommPortIdentifier portId=null;String messageString="hello \n";try{portId=("COM1");}catch(NoSuchPortException ne) {"ne"); ();}try{serialPort=(SerialPort) ("TestComm", 5);OutputStream output = ();doutput=new DataOutputStream(output);inputStream = ();}catch(PortInUseException ex) {"ex");();}catch(IOException ie) {"ie");();//();}try {(9600, , , ;} catch (UnsupportedCommOperationException e) {}}try {());} catch (IOException e) {}}6、串口打开后,用InputStream和DataOutputStream读写就可以了。
java串口通信

java串⼝通信java串⼝通信,由于没有相应的串⼝硬件,选了⼀款windows串⼝虚拟机机器1. 准备串⼝模拟器Launch Virtual Serial Port Driver模拟两对四个串⼝,COM1发送数据给COM2,COM3发送数据给COM4java包<dependency><groupId>com.fazecast</groupId><artifactId>jSerialComm</artifactId><version>[2.0.0,3.0.0)</version></dependency>2. java源代码mport com.fazecast.jSerialComm.SerialPort;import com.fazecast.jSerialComm.SerialPortDataListener;import com.fazecast.jSerialComm.SerialPortEvent;import java.io.BufferedReader;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;/*** @Classname ComTest* @Description com串⼝通信* @Date 2021/9/4 10:44* @Created by huangsm*/public class ComTest {/*** <com名称,SerialPort>串⼝通信map,存储串⼝名称与串⼝信息*/private Map<String, SerialPort> comMap = new HashMap<>();/*** com⼝列表*/private List<String> comList = new ArrayList<>();public ComTest() {//将所有的串⼝信息放⼊comlist,comMap中SerialPort[] commPorts = SerialPort.getCommPorts();for (SerialPort commPort : commPorts) {comList.add(commPort.getSystemPortName());comMap.put(commPort.getSystemPortName(), commPort);//监听所有串⼝通信的数据commPort.openPort();commPort.addDataListener(new SerialPortDataListener() {@Overridepublic int getListeningEvents() {return SerialPort.LISTENING_EVENT_DATA_RECEIVED;}@Overridepublic void serialEvent(SerialPortEvent serialPortEvent) {byte[] newData = serialPortEvent.getReceivedData();System.err.println(String.format("串⼝%s接收到数据⼤⼩:%s,串⼝数据内容:%s",serialPortEvent.getSerialPort().getSystemPortName(),newData.length,new String(newData))); }});}}public static void main(String[] args) throws Exception {ComTest comTest = new ComTest();List<String> comList = List;Map<String, SerialPort> comMap = Map;BufferedReader systemIn = new BufferedReader(new InputStreamReader(System.in));while (true) {System.out.println("你的可以通信的串⼝列表");for (String comName : comList) {System.out.println("========" + comName + "========"); }System.out.println("请输⼊你的串⼝:");String com = systemIn.readLine();if(!comList.contains(com)){System.out.println("输⼊的串⼝不正确:");continue;}System.out.println("输⼊你要发送的消息:");String msg = systemIn.readLine();SerialPort serialPort = comMap.get(com);serialPort.writeBytes(msg.getBytes(),msg.getBytes().length);//这⾥是让串⼝先接收到数据再重新发送数据Thread.sleep(1000);}}}3. 运⾏结果你的可以通信的串⼝列表========COM1================COM2================COM3================COM4========请输⼊你的串⼝:COM3输⼊你要发送的消息:137912037串⼝COM4接收到数据⼤⼩:9,串⼝数据内容:137912037你的可以通信的串⼝列表========COM1================COM2================COM3================COM4========请输⼊你的串⼝:。
用Java开发的一种实用串行通信程序

b Dr e  ̄ c i r; v S r g c n e t n L : d e o b : x t n o n e i UR i o b :d c t x ; p C n e d n c n:n l; o n c o o ul P e ae S ae n s n =n l; r p r d ttme t n t p ul
i UL; fn R ) o
建 立连 接 后 , 可通 过 Peae.a m n 接 即 rprd te et St
口进行数据库的插人 、 更改 、 删除及查询操作。
2 1 1 数据 库 的插 入操 作 ..
数据库操作, v 的串口操作 。下面分别加 以论 Ja a
述。
S n aetQ N E T IT ps k(d a, t g[sr L= Is R N O tys i.r i r S j
维普资讯
29 年3l O 1 第 O 2 第/ 1卷 期
沈 g] ̄t e f eoat n n Ju ] f h na阳航空工业学院学报 a E g er g om ̄ 0 Seyn n d t o A rnui l ni ei u c
M l2 0 a O2 "
特定 的 Widw 环境 下运行 , 于 U i no s 对 nx等平 台则 必须 再次开 发 。
能否采用一种与平台无关的软件开发串行通 信程序一直是软件行业所向往 的. J a 而 a 的跨平 v 台特性正适合这 种需求 。J 引进 了虚拟机原 a ” 理 , Jv 语 言具 有与平 台无关性 。 即用 Jv 使 aa aa语 言编写的程序可以任何时候在任何一台计算机上 运行 。本文结台数据库的数据维护等诸多优 点, 开发出了利用 Jv 编写 的完整 的串行通信使 用 aa
Java串口通信编程指导

Java串口通信编程指导Java串口通信编程概述在java中,利用Java Communication包能够操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,只是在XP下还能使用。
另外,也能够用开源的Rxtx实现串口通信,那个地点仅以Java Communication包,在Windows平台实现串口通信进行讲明。
前期预备下载Java Communication包下载地址如下:/Jolt/javacomm20-win32.zip。
配置解压缩javacomm20-win32.zip把win32com.dll拷贝到{JA V A_HOME}\jre\bin把comm.jar拷贝到{JA V A_HOME}\jre\lib\extset CLASSPATH={JA V A_HOME}\jre \lib\ext \comm.jar;%classpath%实现过程要紧步骤包括:获得串口标识打开串口设置串行端口通讯参数猎取输入(出)流进行读写操作获得串口标识指定串口的端口号,生成串口的标识类的实例。
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 治理事件显示在端口拥有者的中的状态改变。
示例代码如下:代码:打开串口示例代码如下:代码:5000(毫秒)是超时时刻。
设置串行端口通讯参数设置串口传输的波特率、数据位、停止位、奇偶校验等参数。
示例代码如下:代码:try {// 通信条件の設定// 通信速度 9600 baud// データビット 8bit// ストップビット 1bit// パリティなし// フローコントロールの設定// 無制御を使用port.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);port.setFlowControlMode(SerialPort.FLOWCONTROL_NONE);} catch (UnsupportedCommOperationException ex) {ex.printStackTrace();System.exit(1);}猎取输入(出)流利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。
java 串口通信案例

java 串口通信案例Java串口通信是指使用Java编程语言实现与串口设备之间的数据通信。
串口通信在很多应用场景中都有广泛的应用,比如物联网、工业自动化、智能家居等领域。
本文将列举十个以Java串口通信为题的案例,介绍其实现方法和应用场景。
1. 串口读取数据通过Java编程语言实现串口读取数据的功能,可以使用Java的串口通信库,如RXTX、JavaComm等。
首先需要打开串口,并设置串口参数,然后通过监听串口数据的方式实时读取串口传入的数据。
这个案例适用于需要实时监控串口设备数据的应用场景,比如环境监测。
2. 串口发送数据通过Java编程语言实现串口发送数据的功能,可以使用Java的串口通信库。
首先需要打开串口,并设置串口参数,然后通过写入数据的方式将数据发送到串口设备。
这个案例适用于需要向串口设备发送指令或数据的应用场景,比如控制外部设备。
3. 串口数据解析通过Java编程语言实现串口数据解析的功能,可以将从串口读取的原始数据进行解析,提取出有用的信息。
可以根据数据格式进行解析,比如按照特定的协议解析数据。
这个案例适用于需要对串口设备传输的数据进行处理和分析的应用场景。
4. 串口数据存储通过Java编程语言实现串口数据存储的功能,可以将从串口读取的数据保存到本地文件或数据库中。
可以根据需求选择适当的存储方式,比如文本文件、二进制文件或数据库。
这个案例适用于需要对串口设备传输的数据进行长期存储和分析的应用场景。
5. 串口数据转发通过Java编程语言实现串口数据转发的功能,可以将从一个串口读取的数据转发到另一个串口。
可以实现串口设备之间的数据交互,比如串口设备之间的数据通信或设备之间的数据同步。
这个案例适用于需要多个串口设备之间进行数据交互的应用场景。
6. 串口数据监控通过Java编程语言实现串口数据监控的功能,可以监控串口设备的状态和传输数据。
可以实时显示串口设备的连接状态、波特率、数据位、停止位等信息,并实时显示串口传输的数据。
使用Java实现简单串口通信

使⽤Java实现简单串⼝通信没想到挺多⼈需要这个的,很⾼兴这篇⽂章能对⼤家有帮助,主要的⼯具类博⽂⾥已经有了,当然,要⼩⼯具源码的留⾔邮箱即可。
2019.09.05最近接触到了串⼝及其读写,在此记录java进⾏串⼝读写的过程。
1.导⼊⽀持java串⼝通信的jar包:在maven项⽬的pom.xml中添加RXTXcomm的依赖或者下载RXTXcomm.jar并导⼊到项⽬中。
⽀持Java串⼝通信操作的jar包,m⽐较⽼,⽽且不⽀持64位系统,推荐使⽤Rxtx这个jar包(32位/64位均⽀持)。
下载地址:注意:运⾏过程中抛出ng.UnsatisfiedLinkError错误或gnu.io下的类找不到时,将rxtx解压包中的rxtxParallel.dll,rxtxSerial.dll 这两个⽂件复制到C:\Windows\System32 ⽬录下可解决该错误。
2.编写代码操作串⼝:串⼝必要参数类:包含连接串⼝所必须的参数,⽅便在调⽤串⼝时设置和传递串⼝参数/*** 串⼝必要参数接收类* @author: LinWenLi* @date: 2018年7⽉21⽇下午4:30:40*/public class ParamConfig {private String serialNumber;// 串⼝号private int baudRate; // 波特率private int checkoutBit; // 校验位private int dataBit; // 数据位private int stopBit; // 停⽌位public ParamConfig() {}/*** 构造⽅法* @param serialNumber 串⼝号* @param baudRate 波特率* @param checkoutBit 校验位* @param dataBit 数据位* @param stopBit 停⽌位*/public ParamConfig(String serialNumber, int baudRate, int checkoutBit, int dataBit, int stopBit) {this.serialNumber = serialNumber;this.baudRate = baudRate;this.checkoutBit = checkoutBit;this.dataBit = dataBit;this.stopBit = stopBit;}getter()...setter()...}串⼝操作类:(其中包含的CustomException是⾃定义异常类,仅⽤于抛出异常原因。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java的串口通信程序首先需要到到sun主页下载串口通信的包,因为一般的jrd中不含有这个包的,有点补丁的意思。
(CSDN上也有)。
解压缩,为了使Java Communications API能够正确的与Windows系统交互,需要几个小的技巧。
下面是三个很重要的文件,你可以从Sun的网站上下载得到comm.jarwin32com.dllm.properties对于JVM来说,要正确的识别串口,将这几个文件放在系统中合适的位置使很重要的。
comm..jar应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib/extwin32com.dll应该放在以下目录中%windir%system32.properties应该放在以下目录中%JAVA_HOME%/lib%JAVA_HOME%/jre/lib你可以通过编译和运行Sun的例程来验证串口是否可以使用了。
JBuilder中安装安装Java Communication API(以下在JBuilder 2006中测试通过)如果你使用JBuilder,那么还需要为JBuilder配置API。
一般来说,根据你的JBuilder配置,你也许需要将win32com.dll和.properties安装到相应的目录中,可以参照上述的目录。
例如,如果你使用JBuilder附带的JVM的话,你也许需要将win32com.dll和.properties放到C:\Borland\JBuilder2006\jdk1.5的相应位置。
我使用的是JCreator,在打开Configure,然后点击option,选中jdk profile然后双击选中的jdk文件,选择edit,在弹出的窗口中选择串口通信包所在的文件(.jar文件),这样配置就算完成了。
以下分别是接收和发送程序,CSDN上搜的,省的自己写了:发送程序:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import m.*;class S_Frame extends Frame implements Runnable,ActionListener{/*检测系统中可用的通讯端口类 */static CommPortIdentifier portId;/*Enumeration 为枚举型类,在util中 */static Enumeration portList;OutputStream outputStream;/*RS-232的串行口 */SerialPort serialPort;Thread readThread;Panel p=new Panel();TextField in_message=new TextField("打开COM1,波特率9600,数据位8,停止位1.");TextArea out_message=new TextArea();Button btnOpen=new Button("打开串口, 发送数据");Button btnClose=new Button("关闭串口, 停止发送数据");byte data[]=new byte[10240];/*设置判断要是否关闭串口的标志*/boolean mark;/*安排窗体*/S_Frame(){ super("串口发送数据");setSize(200,200);setVisible(true);add(out_message,"Center");add(p,"North");p.add(btnOpen);p.add(btnClose);add(in_message,"South");btnOpen.addActionListener(this);btnClose.addActionListener(this);} //R_Frame() end/*点击按扭打开串口.*/public void actionPerformed(ActionEvent event) {if (event.getSource()==btnClose){serialPort.close(); //关闭串口mark=true; //用于中止线程的run()方法in_message.setText("串口COM1已经关闭,停止发送数据.");}else { mark=false;/*从文本区按字节读取数据*/data=out_message.getText().getBytes();/*打开串口*/start();in_message.setText("串口COM1已经打开,正在每2秒钟发送一次数据....."); }} //actionPerformed() end/*打开串口,并调用线程发送数据*/public void start(){/*获取系统中所有的通讯端口 */portList=CommPortIdentifier.getPortIdentifiers();/* 用循环结构找出串口 */while (portList.hasMoreElements()){/*强制转换为通讯端口类型*/portId=(CommPortIdentifier)portList.nextElement();if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){if (portId.getName().equals("COM1")) {/*打开串口 */try {serialPort = (SerialPort) portId.open("ReadComm", 2000);}catch (PortInUseException e) { }/*设置串口输出流*/try {outputStream = serialPort.getOutputStream();}catch (IOException e) {}} //if end} //if end} //while end/*调用线程发送数据*/try{readThread = new Thread(this);//线程负责每发送一次数据,休眠2秒钟readThread.start();}catch (Exception e) { }} //start() end/*发送数据,休眠2秒钟后重发*/public void run() {/*设置串口通讯参数*/try {serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);}catch (UnsupportedCommOperationException e) { } /*发送数据流(将数组data[]中的数据发送出去)*/ try {outputStream.write(data);}catch (IOException e) { }/*发送数据后休眠2秒钟,然后再重发*/try { Thread.sleep(2000);if (mark){return; //结束run方法,导致线程死亡}start();}catch (InterruptedException e) { }} //run() end} //类S_Frame endpublic class SendComm{public static void main(String args[]){ S_Frame S_win=new S_Frame();S_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0); }});S_win.pack();}}接收程序:import java.awt.*;import java.awt.event.*;import java.io.*;import java.util.*;import m.*;class R_Frame extends Frame implementsRunnable,ActionListener,SerialPortEventListener{/* 检测系统中可用的通讯端口类 */static CommPortIdentifier portId;/* Enumeration 为枚举型类,在java.util中 */static Enumeration portList;InputStream inputStream;/* 声明RS-232串行端口的成员变量 */SerialPort serialPort;Thread readThread;String str="";TextField out_message=new TextField("上面文本框显示接收到的数据"); TextArea in_message=new TextArea();Button btnOpen=new Button("打开串口");/*建立窗体*/R_Frame(){super("串口接收数据");setSize(200,200);setVisible(true);btnOpen.addActionListener(this);add(out_message,"South");add(in_message,"Center");add(btnOpen,"North");} //R_Frame() end/*点击按扭所触发的事件:打开串口,并监听串口. */public void actionPerformed(ActionEvent event){/*获取系统中所有的通讯端口 */portList=CommPortIdentifier.getPortIdentifiers();/* 用循环结构找出串口 */while (portList.hasMoreElements()){/*强制转换为通讯端口类型*/portId=(CommPortIdentifier)portList.nextElement();if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){if (portId.getName().equals("COM1")) {try {serialPort = (SerialPort) portId.open("ReadComm", 2000);out_message.setText("已打开端口COM1 ,正在接收数据..... ");}catch (PortInUseException e) { }/*设置串口监听器*/try {serialPort.addEventListener(this);}catch (TooManyListenersException e) { }/* 侦听到串口有数据,触发串口事件*/serialPort.notifyOnDataAvailable(true);} //if end} //if end} //while endreadThread = new Thread(this);readThread.start(); //线程负责每接收一次数据休眠20秒钟} //actionPerformed() end/*接收数据后休眠20秒钟*/public void run() {try {Thread.sleep(20000);}catch (InterruptedException e) { }} //run() end/*串口监听器触发的事件,设置串口通讯参数,读取数据并写到文本区中*/ public void serialEvent(SerialPortEvent event) {/*设置串口通讯参数:波特率、数据位、停止位、奇偶校验*/try{serialPort.setSerialPortParams(9600,SerialPort.DATABITS_8,SerialPort .STOPBITS_1,SerialPort.PARITY_NONE);}catch (UnsupportedCommOperationException e) {}byte[] readBuffer = new byte[20];try {inputStream = serialPort.getInputStream();}catch (IOException e) {}try { /* 从线路上读取数据流 */while (inputStream.available() > 0) {int numBytes = inputStream.read(readBuffer);} //while endstr=new String(readBuffer);/*接收到的数据存放到文本区中*/in_message.append(str+"\n");}catch (IOException e) { }} //serialEvent() end} //类R_Frame endpublic class ReadComm{public static void main(String args[]){/* 实例化接收串口数据的窗体类 */R_Frame R_win=new R_Frame();/* 定义窗体适配器的关闭按钮功能 */R_win.addWindowListener(new WindowAdapter() {public void windowClosing(WindowEvent e) {System.exit(0); }});R_win.pack();}}。