Java串口通信之Rxtx操作
- 格式:pdf
- 大小:324.18 KB
- 文档页数:9
在许多编程语言中,都有用于读取串口数据的函数。
由于你并未指定具体的编程语言,我将提供一些常见语言的示例。
1. Python:在Python中,可以使用`pySerial`库来读取串口数据。
以下是一个简单的示例:```pythonimport serialser = serial.Serial('COM3', 9600) # replace 'COM3' with your port numberwhile True:if ser.in_waiting:line = ser.readline().decode('utf-8').rstrip()print(line)```2. C#:在C#中,可以使用`System.IO.Ports.SerialPort`类来读取串口数据。
以下是一个简单的示例:```csharpusing System.IO.Ports;SerialPort port = new SerialPort("COM3", 9600); // replace 'COM3' with your port numberport.Open();while (true){if (port.BytesToRead > 0){string data = port.ReadLine();Console.WriteLine(data);}}```3. Java:在Java中,可以使用`RXTX`库来读取串口数据。
以下是一个简单的示例:```javaimport gnu.io.*;import java.io.*;CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier("COM3"); // replace 'COM3' with your port numberSerialPort serialPort = (SerialPort) portIdentifier.open("MyOwnPort", 2000);serialPort.setSerialPortParams(9600, SerialPort.DA TABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);InputStream in = serialPort.getInputStream();BufferedReader br = new BufferedReader(new InputStreamReader(in));String line;while ((line = br.readLine()) != null) {System.out.println(line);}```请注意,上述代码中的`"COM3"`应替换为你的串口名称。
Java串⼝通信——RXTX1.前期准备 a.配置 RXTX 2)拷贝动态库到对应的jdk⽬录下 ·Windows平台 拷贝 rxtxSerial.dll ---> <JAVA_HOME>\jre\bin 拷贝 rxtxParallel.dll ---> <JAVA_HOME>\jre\bin ·Linux平台 拷贝 librxtxSerial.so ---> <JAVA_HOME>/jre/lib/i386/ 拷贝 librxtxParallel.so ---> <JAVA_HOME>/jre/lib/i386/ 3)在⼯程根⽬录下创建 lib ⽂件夹(与src平级),将 RXTXcomm.jar 放⼊该⽂件夹中 4)在 pom.xml 中引⼊本地 jar 包依赖<dependencies>......<dependency><groupId>gnu.io</groupId><artifactId>RXTXcomm</artifactId><scope>system</scope><systemPath>${project.basedir}/lib/RXTXcomm.jar</systemPath></dependency></dependencies> b.安装虚拟串⼝驱动:vspd (收费,有破解版) c.安装串⼝调试⼯具:Serial Port Utility (免费)2.使⽤ a.新建串⼝VO类public class SerialVo {/*** 串⼝名称(COM0、COM1、COM2等等)*/private String serialPortName;/*** 波特率* 默认:115200*/private int baudRate;/*** 数据位默认8位* 可以设置的值:SerialPort.DATABITS_5、SerialPort.DATABITS_6、SerialPort.DATABITS_7、SerialPort.DATABITS_8* 默认:SerialPort.DATABITS_8*/private int dataBits;/*** 停⽌位* 可以设置的值:SerialPort.STOPBITS_1、SerialPort.STOPBITS_2、SerialPort.STOPBITS_1_5* 默认:SerialPort.STOPBITS_1*/private int stopBits;/*** 校验位* 可以设置的值:SerialPort.PARITY_NONE、SerialPort.PARITY_ODD、SerialPort.PARITY_EVEN、SerialPort.PARITY_MARK、SerialPort.PARITY_SPACE * 默认:SerialPort.PARITY_NONE*/private int parity;public SerialVo(String serialPortName) {this.serialPortName = serialPortName;this.baudRate = 115200;this.dataBits = SerialPort.DATABITS_8;this.stopBits = SerialPort.STOPBITS_1;this.parity = SerialPort.PARITY_NONE;}public SerialVo(String serialPortName, int baudRate) {this.serialPortName = serialPortName;this.baudRate = baudRate;this.dataBits = SerialPort.DATABITS_8;this.stopBits = SerialPort.STOPBITS_1;this.parity = SerialPort.PARITY_NONE;}public String getSerialPortName() {return serialPortName;}public void setSerialPortName(String serialPortName) {this.serialPortName = serialPortName;}public int getBaudRate() {return baudRate;}public void setBaudRate(int baudRate) {this.baudRate = baudRate;}public int getDataBits() {return dataBits;}public void setDataBits(int dataBits) {this.dataBits = dataBits;}public int getStopBits() {return stopBits;}public void setStopBits(int stopBits) {this.stopBits = stopBits;}public int getParity() {return parity;}public void setParity(int parity) {this.parity = parity;}} b.新建串⼝⼯具类public class SerialUtil {/*** 获得系统可⽤的端⼝名称列表(COM0、COM1、COM2等等)*/public static List<String> getSerialPortList() {List<String> systemPorts = new ArrayList<>();//获得系统可⽤的端⼝Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();while (portList.hasMoreElements()) {String portName = portList.nextElement().getName();//获得端⼝的名字systemPorts.add(portName);}return systemPorts;}/*** 打开串⼝*/public static SerialPort openSerialPort(SerialVo serialVo, int timeout) throws Exception {//通过端⼝名称得到端⼝CommPortIdentifier portIdentifier = CommPortIdentifier.getPortIdentifier(serialVo.getSerialPortName());//打开端⼝,(⾃定义名字,打开超时时间)CommPort commPort = portIdentifier.open(serialVo.getSerialPortName(), timeout);//判断是不是串⼝if (commPort instanceof SerialPort) {SerialPort serialPort = (SerialPort) commPort;//设置串⼝参数(波特率,数据位8,停⽌位1,校验位⽆)serialPort.setSerialPortParams(serialVo.getBaudRate(), serialVo.getDataBits(), serialVo.getStopBits(), serialVo.getParity()); System.out.println("开启串⼝成功,串⼝名称:" + serialVo.getSerialPortName());return serialPort;} else {//是其他类型的端⼝throw new NoSuchPortException();}}/*** 关闭串⼝*/public static void closeSerialPort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();System.out.println("关闭了串⼝:" + serialPort.getName());}}/*** 向串⼝发送数据*/public static void sendData(SerialPort serialPort, byte[] data) {OutputStream os = null;try {//获得串⼝的输出流os = serialPort.getOutputStream();os.write(data);os.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (os != null) {os.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 从串⼝读取数据*/public static byte[] readData(SerialPort serialPort) {InputStream is = null;byte[] bytes = null;try {//获得串⼝的输⼊流is = serialPort.getInputStream();//获得数据长度int bufflenth = is.available();while (bufflenth != 0) {//初始化byte数组bytes = new byte[bufflenth];is.read(bytes);bufflenth = is.available();}} catch (IOException e) {e.printStackTrace();} finally {try {if (is != null) {is.close();}} catch (IOException e) {e.printStackTrace();}}return bytes;}/*** 给串⼝设置监听*/public static void setListenerToSerialPort(SerialPort serialPort, SerialPortEventListener listener) throws Exception {//给串⼝添加事件监听serialPort.addEventListener(listener);//串⼝有数据监听serialPort.notifyOnDataAvailable(true);//中断事件监听serialPort.notifyOnBreakInterrupt(true);}}3.调试 a.新建测试类public class App {//防⽌被GC回收private static SerialVo serialVo;public static void main( String[] args ) {//获得系统可⽤的端⼝名称List<String> portList = SerialUtil.getSerialPortList();System.out.println(portList);try {serialVo = new SerialVo("COM2");final SerialPort serialPort = SerialUtil.openSerialPort(serialVo, 115200);//启动⼀个线程每2s向串⼝发送数据,发送1000次hellonew Thread(() -> {int i = 1;while (i < 1000) {String s = "hello " + i++;byte[] bytes = s.getBytes();SerialUtil.sendData(serialPort, bytes);//发送数据try {Thread.sleep(2000);} catch (InterruptedException e) {e.printStackTrace();}}}).start();//设置串⼝的listenerSerialUtil.setListenerToSerialPort(serialPort, event -> {//数据通知if (event.getEventType() == SerialPortEvent.DATA_AVAILABLE) {byte[] bytes = SerialUtil.readData(serialPort);System.out.println("收到的数据长度:" + bytes.length);System.out.println("收到的数据:" + new String(bytes));}});} catch (Exception e) {e.printStackTrace();}}} b.使⽤ vspd 添加两个虚拟串⼝ COM2 和 COM3 c.使⽤ Serial Port Utility 测试串⼝的收发 d.注意:vspd 添加的虚拟串⼝为 COM2 和 COM3,Java代码中连接的是 COM2,则 Serial Port Utility 需连接 COM3。
Javaspringboot串⼝通信基于win10 环境1. Virtual Serial Port Driver Pro 开通两个虚拟串⼝2. 打开串⼝调试助⼿3. 代码逻辑<?xml version="1.0" encoding="UTF-8"?><project xmlns="/POM/4.0.0" xmlns:xsi="/2001/XMLSchema-instance" xsi:schemaLocation="/POM/4.0.0 https:///xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.10.RELEASE</version><relativePath/> <!-- lookup parent from repository --></parent><groupId>com.example</groupId><artifactId>port</artifactId><version>0.0.1-SNAPSHOT</version><name>port</name><description>Demo Serial Port project for Spring Boot</description><properties><java.version>1.8</java.version><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><lombok.version>1.18.16</lombok.version><ng3.version>3.11</ng3.version><fastjson.version>1.2.75</fastjson.version></properties><dependencies><dependency><groupId>com.RXTXcomm</groupId><artifactId>RXTXcomm</artifactId><version>1.0.1</version><scope>system</scope><systemPath>${project.basedir}/src/main/resources/lib/RXTXcomm.jar</systemPath> </dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok.version}</version><scope>provided</scope></dependency><dependency><groupId>mons</groupId><artifactId>commons-lang3</artifactId><version>${ng3.version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson.version}</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-compiler-plugin</artifactId><configuration><source>1.8</source><target>1.8</target></configuration></plugin></plugins><resources><resource><directory>src/main/resources</directory><includes><include>**/*.*</include></includes><filtering>true</filtering></resource><resource><directory>src/main/lib</directory><targetPath>BOOT-INF/lib/</targetPath><includes><include>**/*.jar</include></includes></resource></resources></build></build></project>package com.example.port;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import javax.annotation.PreDestroy;@SpringBootApplicationpublic class PortApplication {public static void main(String[] args) {SpringApplication.run(PortApplication.class, args);}@PreDestroypublic void destory() {//关闭应⽤前关闭端⼝SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();serialPortUtil.removeListener(PortInit.serialPort, new MyLister());serialPortUtil.closePort(PortInit.serialPort);}}package com.example.port;import gnu.io.SerialPort;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.ApplicationArguments;import org.springframework.boot.ApplicationRunner;import ponent;import java.util.ArrayList;@Componentpublic class PortInit implements ApplicationRunner {public static SerialPort serialPort = null;@Value("${portname}")private String portname;@Overridepublic void run(ApplicationArguments args) {//TestA();//查看所有串⼝SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();ArrayList<String> port = serialPortUtil.findPort();System.out.println("发现全部串⼝:" + port);System.out.println("打开指定portname:" + portname);//打开该对应portname名字的串⼝PortInit.serialPort = serialPortUtil.openPort(portname, 9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);//给对应的serialPort添加监听器serialPortUtil.addListener(PortInit.serialPort, new MyLister());}}package com.example.port;/*** @author 7788* @version 1.0* @date 2021/4/6 上午 9:26* @location wuhan*/import gnu.io.*;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.slf4j.LoggerFactory;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.util.ArrayList;import java.util.Enumeration;import java.util.TooManyListenersException;public class SerialPortUtil {private static final Logger logger = LoggerFactory.getLogger(SerialPortUtil.class);private static SerialPortUtil serialPortUtil = null;static {//在该类被ClassLoader加载时就初始化⼀个SerialTool对象if (serialPortUtil == null) {serialPortUtil = new SerialPortUtil();}}//私有化SerialTool类的构造⽅法,不允许其他类⽣成SerialTool对象private SerialPortUtil() {}/*** 获取提供服务的SerialTool对象** @return serialPortUtil*/public static SerialPortUtil getSerialPortUtil() {if (serialPortUtil == null) {serialPortUtil = new SerialPortUtil();}return serialPortUtil;}/*** 查找所有可⽤端⼝** @return可⽤端⼝名称列表*/public ArrayList<String> findPort() {//获得当前所有可⽤串⼝Enumeration<CommPortIdentifier> portList = CommPortIdentifier.getPortIdentifiers();ArrayList<String> portNameList = new ArrayList<>();//将可⽤串⼝名添加到List并返回该Listwhile (portList.hasMoreElements()) {String portName = portList.nextElement().getName();portNameList.add(portName);}return portNameList;}/*** 打开串⼝** @param portName 端⼝名称* @param baudrate 波特率* @param databits 数据位* @param parity 校验位(奇偶位)* @param stopbits 停⽌位* @return串⼝对象* // * @throws SerialPortParameterFailure 设置串⼝参数失败* // * @throws NotASerialPort 端⼝指向设备不是串⼝类型* // * @throws NoSuchPort 没有该端⼝对应的串⼝设备* // * @throws PortInUse 端⼝已被占⽤*/public SerialPort openPort(String portName, int baudrate, int databits, int parity, int stopbits) { 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, databits, stopbits, parity);} catch (UnsupportedCommOperationException e) {}System.out.println("Open " + portName + " sucessfully !");return serialPort;} else {logger.error("不是串⼝");}} catch (NoSuchPortException e1) {logger.error("没有找到端⼝");e1.printStackTrace();} catch (PortInUseException e2) {logger.error("端⼝被占⽤");e2.printStackTrace();}return null;}/*** 关闭串⼝** @param serialPort 待关闭的串⼝对象*/public void closePort(SerialPort serialPort) {if (serialPort != null) {serialPort.close();}}/*** 往串⼝发送数据** @param serialPort 串⼝对象* @param order 待发送数据* // * @throws SendDataToSerialPortFailure 向串⼝发送数据失败* // * @throws SerialPortOutputStreamCloseFailure 关闭串⼝对象的输出流出错 */public void sendToPort(SerialPort serialPort, byte[] order) {OutputStream out = null;try {out = serialPort.getOutputStream();out.write(order);out.flush();} catch (IOException e) {e.printStackTrace();} finally {try {if (out != null) {out.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 从串⼝读取数据** @param serialPort 当前已建⽴连接的SerialPort对象* @return读取到的数据* // * @throws ReadDataFromSerialPortFailure 从串⼝读取数据时出错* // * @throws SerialPortInputStreamCloseFailure 关闭串⼝对象输⼊流出错*/public byte[] readFromPort(SerialPort serialPort) {InputStream in = null;byte[] bytes = null;try {in = serialPort.getInputStream();int bufflenth = in.available();while (bufflenth != 0) {bytes = new byte[bufflenth];in.read(bytes);bufflenth = in.available();}} catch (IOException e) {e.printStackTrace();} finally {} finally {try {if (in != null) {in.close();}} catch (IOException e) {e.printStackTrace();}}return bytes;}/*** 添加监听器** @param port 串⼝对象* @param listener 串⼝监听器* // * @throws TooManyListeners 监听类对象过多*/public void addListener(SerialPort port, SerialPortEventListener listener) {try {//给串⼝添加监听器port.addEventListener(listener);//设置当有数据到达时唤醒监听接收线程port.notifyOnDataAvailable(true);//设置当通信中断时唤醒中断线程port.notifyOnBreakInterrupt(true);} catch (TooManyListenersException e) {// throw new TooManyListeners();logger.error("太多监听器");e.printStackTrace();}}/*** 删除监听器** @param port 串⼝对象* @param listener 串⼝监听器* // * @throws TooManyListeners 监听类对象过多*/public void removeListener(SerialPort port, SerialPortEventListener listener) {//删除串⼝监听器port.removeEventListener();}}package com.example.port;import com.alibaba.fastjson.JSON;import com.example.port.ISO8583.ISO8583;import com.example.port.ISO8583.TransISO8583MessageUtil;import gnu.io.SerialPortEvent;import gnu.io.SerialPortEventListener;import lombok.SneakyThrows;import java.util.Date;/*** @author best*/public class MyLister implements SerialPortEventListener {@SneakyThrows@Overridepublic void serialEvent(SerialPortEvent arg0) {if (arg0.getEventType() == SerialPortEvent.DATA_AVAILABLE) {SerialPortUtil serialPortUtil = SerialPortUtil.getSerialPortUtil();byte[] bytes = serialPortUtil.readFromPort(PortInit.serialPort);String byteStr = new String(bytes, 0, bytes.length).trim();// System.out.println(new Date() + "【读到的字节数组】:-----" + byteStr);// ISO8583 aiISO8583DTO = (ISO8583) TransISO8583MessageUtil.unpackISO8583(ISO8583.class, byteStr); // System.out.println("UNPACK ISO8583: " + JSON.toJSONString(aiISO8583DTO));System.out.println("===========start===========");System.out.println(new Date() + "【读到的字节数组】:-----" + byteStr);String needData = printHexString(bytes);System.out.println(new Date() + "【字节数组转字符串】:-----" + needData);System.out.println(new Date() + "【16进制字符串转字符串】:" + hexStringToString(needData));System.out.println("===========end===========");// ISO8583 aiiso8583DTO = new ISO8583();//// aiiso8583DTO.setCardNo02(String.valueOf(System.currentTimeMillis()));// aiiso8583DTO.setTransProcCode03("123456");// aiiso8583DTO.setTransAmt04("000010000000");// aiiso8583DTO.setSysTrackNo11("888888");// aiiso8583DTO.setServiceInputModeCode22("100");// aiiso8583DTO.setServiceConditionCode25("66");// aiiso8583DTO.setCardAcceptorTerminalID41("08022206");// aiiso8583DTO.setCardAcceptorID42("000100000000005");// aiiso8583DTO.setAdditionalDataPrivate48("0000");// aiiso8583DTO.setCurrencyCode49("168");// aiiso8583DTO.setEWalletTransInfo58("53560118FFFFFFFFFFFF03104890100000006059FFFFFFFF0101000200000064020000080000032017122310225672FB4788000 // aiiso8583DTO.setFld60Domain60("41000006666");// aiiso8583DTO.setOriginalInfoDomain61("000666000181");// aiiso8583DTO.setFld63Domain63("0000000000000000");// String maxBitmap = "7020048000C1805B";// final String TPDU = "6000000000";// final String HEAD = "612200000000";// String sendMsg = TransISO8583MessageUtil.packISO8583(aiiso8583DTO, maxBitmap, TPDU, HEAD, "0300");//接收到消息后回复⼀个当前时间serialPortUtil.sendToPort(PortInit.serialPort, new Date().toString().getBytes());}}// 字节数组转字符串private String printHexString(byte[] b) {StringBuffer sbf = new StringBuffer();for (int i = 0; i < b.length; i++) {String hex = Integer.toHexString(b[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sbf.append(hex.toUpperCase() + " ");}return sbf.toString().trim();}/*** 16进制转换成为string类型字符串** @param s* @return*/public static String hexStringToString(String s) {if (s == null || s.equals("")) {return null;}s = s.replace(" ", "");byte[] baKeyword = new byte[s.length() / 2];for (int i = 0; i < baKeyword.length; i++) {try {baKeyword[i] = (byte) (0xff & Integer.parseInt(s.substring(i * 2, i * 2 + 2), 16));} catch (Exception e) {e.printStackTrace();}}try {s = new String(baKeyword, "UTF-8");new String();} catch (Exception e1) {e1.printStackTrace();}return s;}}接下来启动项⽬就可以了,可以完善MyLister的功能对收到的消息进⾏处理,然后回复消息⽐如ISO8583的报⽂解析并http调⽤接⼝更新数据。
串口通信rx和tx原理摘要:一、串口通信概述1.串口协议类型2.波特率设置二、串口通信原理1.串行通信与并行通信的区别2.串口通信的基本结构三、RX和TX在串口通信中的作用1.RX(接收)2.TX(发送)四、STM32串口通信实例1.硬件连接2.软件设置与调试五、常见问题及解决方案1.接收和发送LED不亮2.串口通信速率不足正文:一、串口通信概述串口通信是一种在单一传输线上将数据以比特位进行传输的通信方式,具有成本低、传输线简洁等优点。
串口通信协议有多种,如USB转TTL、RS232转TTL、RS485转TTL等。
这些协议在传输速度和距离方面有所不同,但都基于TTL逻辑电平。
在串口通信中,发送端和接收端需要遵循相同的格式(如起始位、停止位等)进行数据传输,并设置相同的波特率。
二、串口通信原理串口通信与并行通信相比,虽然传输速度较慢,但只需使用一对传输线即可完成数据传输。
串口通信的基本结构包括地线、TX(发送)和RX(接收)线。
由于串口通信是异步的,发送端和接收端可以在TX线上发送数据。
三、RX和TX在串口通信中的作用1.RX(接收):RX线用于接收来自发送端的数据。
在接收数据时,需要确保数据格式与发送端一致,以便正确解析数据。
2.TX(发送):TX线用于发送数据至接收端。
在发送数据时,同样需要遵循一定的数据格式,如起始位、数据位、停止位等。
四、STM32串口通信实例1.硬件连接:在使用STM32进行串口通信时,需要将两个STM32的TX 和RX引脚连接起来。
例如,将STM32_TX_1与STM32_RX_1相连,同时将STM32_TX_2与STM32_RX_2相连。
2.软件设置与调试:在STM32中,可以通过设置波特率、数据位、停止位等参数实现串口通信。
通常,波特率设置为9600,数据位为8位,停止位为1位。
在调试过程中,可以通过观察接收到的数据是否符合预期来验证通信是否正常。
五、常见问题及解决方案1.接收和发送LED不亮:如果接收和发送LED不亮,可能是由于未正确连接线路或波特率设置不匹配。
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串口通信为题的案例,介绍其实现方法和应用场景。
1. 串口读取数据通过Java编程语言实现串口读取数据的功能,可以使用Java的串口通信库,如RXTX、JavaComm等。
首先需要打开串口,并设置串口参数,然后通过监听串口数据的方式实时读取串口传入的数据。
这个案例适用于需要实时监控串口设备数据的应用场景,比如环境监测。
2. 串口发送数据通过Java编程语言实现串口发送数据的功能,可以使用Java的串口通信库。
首先需要打开串口,并设置串口参数,然后通过写入数据的方式将数据发送到串口设备。
这个案例适用于需要向串口设备发送指令或数据的应用场景,比如控制外部设备。
3. 串口数据解析通过Java编程语言实现串口数据解析的功能,可以将从串口读取的原始数据进行解析,提取出有用的信息。
可以根据数据格式进行解析,比如按照特定的协议解析数据。
这个案例适用于需要对串口设备传输的数据进行处理和分析的应用场景。
4. 串口数据存储通过Java编程语言实现串口数据存储的功能,可以将从串口读取的数据保存到本地文件或数据库中。
可以根据需求选择适当的存储方式,比如文本文件、二进制文件或数据库。
这个案例适用于需要对串口设备传输的数据进行长期存储和分析的应用场景。
5. 串口数据转发通过Java编程语言实现串口数据转发的功能,可以将从一个串口读取的数据转发到另一个串口。
可以实现串口设备之间的数据交互,比如串口设备之间的数据通信或设备之间的数据同步。
这个案例适用于需要多个串口设备之间进行数据交互的应用场景。
6. 串口数据监控通过Java编程语言实现串口数据监控的功能,可以监控串口设备的状态和传输数据。
可以实时显示串口设备的连接状态、波特率、数据位、停止位等信息,并实时显示串口传输的数据。
Java的机器人控制实现智能机器人的编程智能机器人是当今科技领域的热门话题,其应用范围涵盖了工业、医疗、家庭等多个领域。
而实现智能机器人的编程,Java语言提供了强大的支持和便捷的开发环境。
本文将介绍Java的机器人控制实现智能机器人编程的具体方法和步骤。
一、机器人控制器的选择在开始编程之前,我们首先需要选择适合的机器人控制器。
机器人控制器是连接计算机与机器人硬件的中间设备,负责接收指令并控制机器人的运动。
常见的机器人控制器有动态链接库(Dynamic Link Library, DLL)、串口通信、网络通信等方式。
在Java中,我们可以使用Java串口通信库或网络通信库来实现机器人控制。
二、串口通信方式1. 硬件准备:首先,我们需要准备一个支持串口通信的机器人和计算机。
确保机器人和计算机之间通过串口进行连接,并安装好机器人控制器的驱动程序。
2. 导入Java串口通信库:我们可以使用开源的Java串口通信库,比如RXTX或jSerialComm。
将库文件导入到Java项目中,并添加相应的依赖。
3. 打开串口:使用Java串口通信库提供的API,我们可以打开指定的串口,并设置相应的波特率、数据位、校验位等参数。
4. 发送指令:通过串口发送指令给机器人,以实现对机器人运动的控制。
可以根据机器人具体的控制协议进行指令的编写和发送。
5. 接收数据:机器人在执行完指令后,可能会返回一些反馈信息。
我们可以通过串口接收数据,并进行相应的处理和解析。
三、网络通信方式1. 硬件准备:与串口通信方式类似,我们需要准备一个支持网络通信的机器人和计算机。
确保机器人和计算机可以通过局域网或互联网进行连接。
2. 导入Java网络通信库:Java提供了丰富的网络编程API,我们只需要导入相应的库文件即可。
3. 建立连接:使用Java网络通信库提供的API,我们可以建立与机器人的网络连接。
根据机器人的IP地址和端口号,通过Socket或URLConnection等方式建立连接。
基于无线传感定位系统的通信软件一、运行环境:Windows操作系统下运行,由于作品是基于java虚拟机的,所以需要安装jvm 该作品是属于基于硬件的通信软件,所以在对数据的接收上要求无线传感器支持,这个软件主要任务是对无线传感器发送来的数据进行准确,形象的整理和分析。
二、开发环境:软件开发环境是在eclipse这个平台上,基于java的RXTX串口通信技术完成的。
三、功能说明:1、各类结点数据的接受处理和统计;2、界面面板缩进的控制;3、温度数据湿度数据的对比图像;4、图像的缩放功能。
5、室内平面图的上传和缩放以及定位。
6、节点位置信息处理,显示在相对位置图上,每个节点要能够通过颜色反映出节点周围的温度状况。
7、数据的发送功能,我及时的向底层硬件发送数据帧,实现软硬件的实时联系和交互。
8、常用信息的设置功能,比如室温,串口属性信息,数据接受格式等四、作品整体效果展示温湿度曲线显示、控制和对比结点位置信息和温度信息的图像反映五、操作以及功能说明:1、串口设置:要针对电脑接入串口时的属性,和底层数据发送帧的格式在如下面板中设置。
2、常用命令的设置,设置这些向底层发出请求的命令,可以灵活的控制我们所需要的数据,比如我们可以选择请求结点的温度信息,请求结点的湿度信息,或者是位置信息等等。
3、温湿度曲线的控制,设置好之后,点击ok,点击开始按钮,便会接受到底层硬件发来的数据,但是我们的硬件可能是很多个结点,如果都反映在图像上,可能略显混乱,所以我们可以在结点数据面板中控制哪个结点的显示状况。
4、结点位置信息的查看,下面的截图反映了结点的位置信息,大的圆圈是参考结点的位置和温度信息的反映,从内向外温度不断的接近室温,颜色越深的部分表示温度越高,小的绿园是我们要定位的盲几点的位置信息的反映,随着盲几点的实际位置信息的变化,图像中会做出准确的变化。
,5、盲结点和参考结点相关参数的设定,我们选中单选框,信息会出现在文本框中,设置好后,点击update,发送到底层。
小技巧:如何辨别TXD和RXD端口?搞电子的人手边应该常备一个电表,用来测测电压,电阻什么的会很有用。
你只要分别测一下RS232端口的2--5或3--5针脚之间的电压,通常TXD针脚与GND之间会有3~15V左右的负电压,表示它是TXD针脚。
安装JavaCommunicationsAPISun的J2SE中并没有直接提供以上提到的任何一种串行通讯协议的开发包,而是以独立的jar包形式发布在网站上(从这里下载)----即comm.jar,称之为Javatm CommunicationsAPI,它是J2SE的标准扩展。
comm.jar并不是最近才有,早在1998年时,sun就已经发布了这个开发包。
comm.jar分别提供了对常用的RS232串行端口和IEEE1284并行端口通讯的支持。
目前sun发布的comm.jar只有Windows和Solaris平台两个版本,如果你需要Linux平台下的,可以在/~kevinh/linuxcomm.html找到。
在使用comm.jar之前,必须知道如何安装它。
这也是困扰许多初学javaRS232通讯者的一个难题。
如果我们电脑上安装了JDK,它将同时为我们安装一份JRE(Java RuntimeEntironment),通常我们运行程序时都是以JRE来运行的。
所以以下的安装适用于JRE。
如果你是用JDK来运行程序的,请将相应的改成。
下载了comm.jar开发包后,与之一起的还有两个重要的文件,win32com.dll和m.properties。
comm.jar提供了通讯用的javaAPI,而win32com.dll提供了供comm.jar调用的本地驱动接口。
而m.properties是这个驱动的类配置文件。
首先将comm.jar复制到\lib\ext目录。
再将win21com.dll复制到你的RS232应用程序运行的目录,即user.dir。
然后将m.properties复制到\lib目录。