java下的串口通信-RXTX
关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已。简单的入门可以参照官方的wiki。
对应你的开发环境(Linux、window、Mac)下载对应的文件(下载地址),这里说下具体的安装方法,官方给的有点啰嗦,在Eclipse下使用,下载后里面的文件:
RXTXcomm.jar包放到你项目的lib文件夹下,Java Builder Path---->Add to builder path,然后对应系统环境选择文件:
将两个文件直接拷贝到项目的根目录下:
问题1
注意,我安装的时候出现了“VM warning: You have loaded library /****/***/***/librxtxSerial.so which might have disabled stack guard. The VM will try to fix the stack guard now.
It's highly recommended that you fix the library with 'execstack -c <libfile>', or link it with '-z noexecstack'.”
google很久没有解决办法,所以按照给出的提示信息,sudo apt-get install execstack,安装了execstack后,在librxtxSerial所在的文件夹,打开终端,按照提少的要求execstack -c librxtxSerial.so即可解决。
问题2
找不到设备,这是权限问题,你应该在终端下用sudo命令启动Eclipse
关于使用:
建议你参考这两篇博客:使用comm在java程序中管理本地端口和Java串口通讯,两篇讲的是一些基础知识依据API的基本用法,当然如果你依据很熟悉,那么你可以直接写写代码运行下,比如扫描当前的设备端口:
public static void listPorts()
{
java.util.Enumeration<CommPortIdentifier> portEnum = CommPortIdentifier.getPortIdentifiers();
while ( portEnum.hasMoreElements() )
{
CommPortIdentifier portIdentifier = portEnum.nextElement();
System.out.println(portIdentifier.getName() + " - " + getPortTypeName(portIdentifier.getPortType()) );
}
} public static String getPortTypeName ( int portType )
{
switch ( portType )
{
case CommPortIdentifier.PORT_I2C:
return "I2C";
case CommPortIdentifier.PORT_PARALLEL:
return "Parallel";
case CommPortIdentifier.PORT_RAW:
return "Raw";
case CommPortIdentifier.PORT_RS485:
return "RS485";
case CommPortIdentifier.PORT_SERIAL:
return "Serial";
default:
return "unknown type";
}
}
串口通信,有两种方式,两篇博客说的很详细了,你也可以参考wiki的例子了解其通信流程,我仿照官方写的例子,部分有改动,SerialRXTX.java:
package nir.desktop.demo; import gnu.io.CommPort;
import gnu.io.CommPortIdentifier;
import gnu.io.PortInUseException;
import gnu.io.SerialPort;
import gnu.io.SerialPortEvent;
import gnu.io.SerialPortEventListener; import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.Enumeration;
import java.util.HashSet; public class SerialRXTX {
/**
* This code snippet shows how to retrieve the available comms ports on your
* computer. A CommPort is available if it is not being used by another
* application.
*/
public static void listAvailablePorts() {
HashSet<CommPortIdentifier> portSet = getAvailableSerialPorts();
String[] serialPort = new String[portSet.size()];
int i = 0;
for (CommPortIdentifier comm : portSet) {
serialPort[i] = comm.getName();
System.out.println(serialPort[i]);
i++;
}
} public static String getPortTypeName(int portType) {
switch (portType) {
case CommPortIdentifier.PORT_I2C:
return "I2C";
case CommPortIdentifier.PORT_PARALLEL:
return "Parallel";
case CommPortIdentifier.PORT_RAW:
return "Raw";
case CommPortIdentifier.PORT_RS485:
return "RS485";
case CommPortIdentifier.PORT_SERIAL:
return "Serial";
default:
return "unknown type";
}
} /**
* @return A HashSet containing the CommPortIdentifier for all serial ports
* that are not currently being used.
*/
public static HashSet<CommPortIdentifier> getAvailableSerialPorts() {
HashSet<CommPortIdentifier> h = new HashSet<CommPortIdentifier>();
@SuppressWarnings("rawtypes")
Enumeration thePorts = CommPortIdentifier.getPortIdentifiers();// 可以找到系统的所有的串口,每个串口对应一个CommPortldentifier
while (thePorts.hasMoreElements()) {
CommPortIdentifier com = (CommPortIdentifier) thePorts
.nextElement();
switch (com.getPortType()) {
case CommPortIdentifier.PORT_SERIAL:// type of the port is serial
try {
CommPort thePort = com.open("CommUtil", 50);// open the serialPort
thePort.close();
h.add(com);
} catch (PortInUseException e) {
System.out.println("Port, " + com.getName()
+ ", is in use.");
} catch (Exception e) {
System.err.println("Failed to open port " + com.getName());
e.printStackTrace();
}
}
}
return h;
} public static SerialPort connect(String portName) throws Exception {
SerialPort serialPort = null;
CommPortIdentifier portIdentifier = CommPortIdentifier
.getPortIdentifier(portName);// initializes of port operation
if (portIdentifier.isCurrentlyOwned()) {
System.out.println("Error: Port is currently in use");
} else {
CommPort commPort = portIdentifier.open(portName, 2000);// the delay
// time of
// opening
// port
if (commPort instanceof SerialPort) {
serialPort = (SerialPort) commPort;
serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);// serial
// communication
// parameters
// setting
InputStream inputStream = serialPort.getInputStream();
// OutputStream outputStream = serialPort.getOutputStream();
// (new Thread(new SerialWriter(outputStream))).start();
serialPort.addEventListener(new SerialReader(inputStream));
serialPort.notifyOnDataAvailable(true);
}
}
return serialPort; } /**
* not necessary to send command in new thread, but the serialPort only has
* one instance
*
* @param serialPort
* @param string
*/
public static void sendMessage(SerialPort serialPort, String string) {
try {
OutputStream outputStream = serialPort.getOutputStream();
(new Thread(new SerialWriter(outputStream, string))).start();// send
// command
// in
// the
// new
// thread
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} /**
* Handles the input coming from the serial port. A new line character is
* treated as the end of a block in this example.
*/
public static class SerialReader implements SerialPortEventListener {
private InputStream in; public SerialReader(InputStream in) {
this.in = in;
} public void serialEvent(SerialPortEvent arg0) {
byte[] buffer = new byte[1024];
try {
Thread.sleep(500);// the thread need to sleep for completed
// receive the data
if (in.available() > 0) {
in.read(buffer);
}
System.out.println(new String(buffer));
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} } /** */
public static class SerialWriter implements Runnable {
OutputStream out;
String commandString; public SerialWriter(OutputStream out, String commandString) {
this.out = out;
this.commandString = commandString;
} public void run() {
while (true) {
try {
Thread.sleep(3000);// an interval of 3 seconds to sending
// data
out.write(commandString.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
} public static void main(String[] args) {
listAvailablePorts();
try {
sendMessage(connect("/dev/ttyUSB0"), "P");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} }
返回的数据:
在监听返回数据的时候,出现的问题是返回的数据不连续,比如:
P
H:05.36
解决的方法是在接受的地方让线程休眠一下,即可解决
Thread.sleep(500);
java下的串口通信-RXTX的更多相关文章
- Mac下的串口通信-ORSSerialPort
================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...
- WinCE下的串口通信开发(VS2005,VB.Net,VC++)
WinCE下的串口通信开发(VS2005,VB.Net,VC++) WinCE下的串口通信开发 一.利用Visual Basic 开发很简单,因为有现成的控件可以直接调用 以VS2005为例,首先 ...
- Java串口通信 RXTX 解决过程
背景介绍: 由于第一次用Java与硬件通信,网上查了许多资料,在这进行整理,便于以后学习.本人串口测试是USB串口设备连接电脑,在设备管理器中找到端口名称(也可以通过一些虚拟串口工具模拟). 下面主要 ...
- 使用Java实现简单串口通信
最近一门课要求编写一个上位机串口通信工具,我基于Java编写了一个带有图形界面的简单串口通信工具,下面详述一下过程,供大家参考 ^_^ 一: 首先,你需要下载一个额外的支持Java串口通信操作的jar ...
- Java实现RS485串口通信,发送和接收数据进行解析
最近项目有一个空气检测仪,需要得到空气检测仪的实时数据,保存到数据库当中.根据了解得到,硬件是通过rs485进行串口通讯的,需要发送16进制命令给仪器,然后通过轮询来得到数据. 需要先要下载RXTX的 ...
- Java实现RS485串口通信
前言 前段时间赶项目的过程中,遇到一个调用RS485串口通信的需求,赶完项目因为楼主处理私事,没来得及完成文章的更新,现在终于可以整理一下当时的demo,记录下来. 首先说一下大概需求:这个项目是机器 ...
- java可用与串口通信的一些库
java原生对串口的支持只有javax.comm,javax.comm比较老了,而且不支持64位系统,我在看jlibmodbus(一个java实现的modbus协议栈)的时候发现了几个可供使用的jav ...
- 基于usb4java实现的java下的usb通信
项目地址:点击打开 使用java开发的好处就是跨平台,基本上java的开发的程序在linux.mac.MS上都可以运行,对应这java的那句经典名言:一次编写,到处运行.这个项目里面有两种包选择,一个 ...
- 在ubuntu下利用minicom实现串口通信
windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...
随机推荐
- WEB 项目中的全局异常处理
在web 项目中,遇到异常一般有两种处理方式:try.....catch....:throw 通常情况下我们用try.....catch.... 对异常进行捕捉处理,可是在实际项目中随时的进行异常捕捉 ...
- Java探索之旅(17)——多线程(1)
1.多线程 1.1线程 线程是程序运行的基本执行单元.指的是一段相对独立的代码,执行指定的计算或操作.多操作系统执行一个程序时会在系统中建立一个进程,而在这个进程中,必须至少建立一个线程(这个线程被 ...
- SharePoint 2013上传AI格式文件,再次下载后变成了PS格式文件
问题: SharePoint 2013上传AI格式文件,再次下载后变成了PS格式文件 需要下载副本才能显示AI格式 解决办法有两个: 第一种,在客户端机器1. Click Start, click R ...
- sharepoint SDDL 字符串包含无效的SID或无法转换的SID
安装过程中出现以下错误 采用独立模式安装Sharepoint Server 2013/Foundation 2013,在进行配置向导的时候会碰到这样的错误 System.ArgumentExcepti ...
- R: which(查询位置)、%in% (是否存在)、ifelse(判断是否):
################################################### 问题:ifelse.which.%in% 18.4.27 解决方案: > x < ...
- Python中使用json.loads解码字符串时出错:ValueError: Expecting property name: line 1 column 1 (char 1)
解决办法,json数据只能用双引号,而不能用单引号
- 6.JBoss5.x6.x 反序列化漏洞(CVE-2017-12149)复现
2017 年 9 月 14 日,国家信息安全漏洞共享平台( CNVD )收录了 JBOSS Application Server 反序列化命令执行漏洞( CNVD-2017-33724,对应 CVE- ...
- Eclipse提交svn错误svn E210003 connection refused by the server
错误明细: org.apache.subversion.javahl.ClientException: svn: E210003: connection refused by the server o ...
- CSS概念 - 可视化格式模型(一) 盒模型与外边距叠加
可以参考<精通CSS 高级WEB标准解决方案>第三章. 可视化格式模型 可视化格式模型要掌握的3个最重要的CSS概念是 浮动.定位.盒模型. 这些概念控制在页面上安排和显示元素的方式, 形 ...
- VS Code 缩小
一.问题描述 当我们在使用 Visual Studio Code 时,放大,我们可以使用 “ CTRL + ” 快捷键来实现.在使用 “ CRRL - ” 快捷键,缩小不了,我们怎么办? 二.解决方案 ...