一年半前在jbuilder2006下写过串口通信程序,最近做一个GPS-SMS项目,用到串口通信,在JBUILDER 配置了comm.jar却发现找不到端口,经过几番查找才发现自己配置的路径错了,浪费了不少时间,有必要记下来,防止下次出错,此次还暴露了自己看文章一目十行,走马观花的毛病。
Javax.comm是Sun公司提供的,用于开发平台独立的通讯应用程序的扩展API。(ps:这里javax的x很准确地表明了它是一个扩展包,而不是核心包(core package),但由于历史原因,javax下的并不都是扩展包,比如swing包已经是Java核心架构的一部分了,不过为了与Java1.1编码兼容,仍使用javax.swing。)javax.comm可以访问RS232接口(串口)及有限制地访问IEEE-1284(并口)。
下载
需要到其官方主页
http://java.sun.com/products/javacomm/下载这个API,目前的最新版本是3.0。不过可惜的是,Sun目前没有推出此API在Windows平台下的3.0版本,主页上列出的三个版本,分别是运行在x86和Sparc结构下的Solaris系统,以及x86下的Linux系统。要下载Windows版本只能去寻找较老的版本了。我所找到的2个网址是
http://llk.media.mit.edu/projects/cricket/software/javaSerial.zip(两个文件夹里面有所需的3个文件),
http://mdubuc.freeshell.org/Jolt/javacomm20-win32.zip和(完整的2.0版本,还有examples)。
安装
这里的所谓安装就是把三个重要的文件放到指定的目录下。
将下载的文件解压缩后,在\javacomm20-win32\commapi目录下有必需的三个文件comm.jar,javax.comm. properties和win32comm.dll。将文件comm.jar拷贝到%JAVA_HOME%\jre\lib\ext;文件javax.comm. properties拷贝到%JAVA_HOME%\jre\lib; 文件win32comm.dll拷贝到%JAVA_HOME%\bin。注意%JAVA_HOME%是jdk的路径,而非jre。
API
在javax.comm下有13个类和接口,分别是
4个接口
CommDriver 可负载设备(the loadable device)驱动程序接口的一部分
CommPortOwnershipListener 传递各种通讯端口的所有权事件
ParallelPortEventListener 传递并行端口事件
SerialPortEventListener 传递串行端口事件
6个类
CommPort 通讯端口
CommPortIdentifier通讯端口管理
ParallelPort 并行通讯端口
ParallelPortEvent 并行端口事件
SerialPort RS-232串行通讯端口
SerialPortEvent 串行端口事件
3个异常类
NoSuchPortException 当驱动程序不能找到指定端口时抛出
PortInUseException 当碰到指定端口正在使用中时抛出
UnsupportedCommOperationException 驱动程序不允许指定操作时抛出
实例
同API一起下载的还有一个examples文件,里面有6个程序。首先看最简单的读、写程序。
读串口的例程
import java.io.*;
import java.util.*;
import javax.comm.*;
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList;//枚举类
InputStream inputStream;
SerialPort serialPort;
Thread readThread;
public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();/*不带参数的getPortIdentifiers方
法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。注意这里的端口
不仅仅是指串口,也包括并口。这个方法还可以带参数。getPortIdentifiers(CommPort)获得与已经被应
用程序打开的端口相对应的CommPortIdentifier对象。getPortIdentifier(String portName)获取指定端
口名(比如“COM1”)的CommPortIdentifier对象。*/
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)/*getPortType方法返回
端口类型*/ {
// if (portId.getName().equals("COM1"))/* 找Windows下的第一个串口*/ {
if (portId.getName().equals("/dev/term/a"))/*找Unix-like系统下的第一个串口*/
{
SimpleRead reader = new SimpleRead();
}
}
}
}
public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);/* open方法打开通讯
端口,获得一个CommPort对象。它使程序独占端口。如果端口正被其他应用程序占用,将使用
CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。每个端口都关联一个
InputStream 何一个OutputStream。如果端口是用open方法打开的,那么任何的getInputStream都将返回
相同的数据流对象,除非有close被调用。有两个参数,第一个为应用程序名;第二个参数是在端口打开
时阻塞等待的毫秒数。*/
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();/*获取端口的输入流对象*/
} catch (IOException e) {}
try {
serialPort.addEventListener(this);/*注册一个SerialPortEventListener事件来监听串
口事件*/
} catch (TooManyListenersException e) {}
serialPort.notifyOnDataAvailable(true);/*数据可用*/
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);/*设置串口初始化参数,依次是波特率,数据位,停止位和
校验*/
} catch (UnsupportedCommOperationException e) {}
readThread = new Thread(this);
readThread.start();
}
public void run() {
try {
Thread.sleep(20000);
} catch (InterruptedException e) {}
}
//串口事件
public void serialEvent(SerialPortEvent event) {
switch(event.getEventType()) {
case SerialPortEvent.BI:/*Break interrupt,通讯中断*/
case SerialPortEvent.OE:/*Overrun error,溢位错误*/
case SerialPortEvent.FE:/*Framing error,传帧错误*/
case SerialPortEvent.PE:/*Parity error,校验错误*/
case SerialPortEvent.CD:/*Carrier detect,载波检测*/
case SerialPortEvent.CTS:/*Clear to send,清除发送*/
case SerialPortEvent.DSR:/*Data set ready,数据设备就绪*/
case SerialPortEvent.RI:/*Ring indicator,响铃指示*/
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:/*Output buffer is empty,输出缓冲区清空*/
break;
case SerialPortEvent.DATA_AVAILABLE:/*Data available at the serial port,端口有可用
数据。读到缓冲数组,输出到终端*/
byte[] readBuffer = new byte[20];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(new String(readBuffer));
} catch (IOException e) {}
break;
}
}
}
(PS:不推荐Thread的这种用法,详见《Core Java VolumeII》)
写串口的例程
把字符串"Hello, world!\n"写到系统的第一个串口
import java.io.*;
import java.util.*;
import javax.comm.*;
public class SimpleWrite {
static Enumeration portList;
static CommPortIdentifier portId;
static String messageString = "Hello, world!\n";
static SerialPort serialPort;
static OutputStream outputStream;
public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
// if (portId.getName().equals("COM1")) {
if (portId.getName().equals("/dev/term/a")) {
try {
serialPort = (SerialPort)
portId.open("SimpleWriteApp", 2000);
} catch (PortInUseException e) {}
try {
outputStream = serialPort.getOutputStream();
} catch (IOException e) {}
try {
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8,
SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
} catch (UnsupportedCommOperationException e) {}
try {
outputStream.write(messageString.getBytes());
} catch (IOException e) {}
}
}
}
}
}
上面两个例程都经过了简化,在打开端口,并且传输结束后没有关闭数据流和串口。在例程中我们看
到CommPortIdentifier提供了打开通讯端口的方法open,但却没有相应关闭端口的方法,关闭端口需要调
用javax.comm.CommPort类的close()。CommPort是这个包中的一个高级抽象,它定义了端口可作的各种事
情:获取I/O数据流对象,控制缓冲区大小,调整输入的处理。
分享到:
相关推荐
Java串口编程是Java开发中一个重要的领域,尤其在物联网(IoT)、嵌入式系统和设备通信中,它扮演着关键角色。本资源包包含的8个文件旨在帮助开发者全面理解并掌握这一技术。以下是对每个知识点的详细解释: 1. **...
Java串口编程
Java串口编程是一种在Java应用程序中与物理串行端口进行通信的技术,广泛应用于设备控制、数据采集、物联网(IoT)应用等领域。本实例旨在通过简洁易懂的代码示例,帮助开发者理解如何在Java中实现串口通信。 首先,...
java串口编程实例 ConnDB.java
Java串口编程是一种在Java应用程序中与物理串行端口进行通信的技术,广泛应用于设备控制、数据采集、物联网(IoT)等领域。本实例将详细讲解如何使用Java进行串口通信,并提供一个Java手机串口短信发送的代码示例。 ...
Java串口编程API包是Java平台上进行串行通信的关键工具,它允许开发者通过Java程序控制串行端口,实现与外部设备的交互。这个API包包括了几个关键组件,如`comm2.0.jar`、`win32com.dll`以及`javax.comm.properties`...
一、Java串口编程基础 1. 串行通信:串行通信是一种数据传输方式,数据按位顺序传输。与并行通信相比,串行通信成本更低,但速度较慢。常见的串口接口有RS-232、USB转串口等。 2. 串口参数:波特率、数据位、停止...
Java串口编程是Java开发中一个相对特殊但重要的领域,特别是在设备交互、嵌入式系统或物联网(IoT)应用中。"JAVA 串口编程JDK" 提供了一个Java运行环境包,使得开发者能够利用Java语言进行串口通信,这对于那些希望在...
Java串口编程是Java开发中一个相对小众但重要的领域,尤其在嵌入式系统、自动化设备、物联网(IoT)等领域应用广泛。在进行Java串口编程之前,需要了解和准备一些基础知识和工具,以便顺利地实现串口通信。 首先,...
Java串口编程在Mac OS平台上是一项重要的技术,它允许开发者通过Java程序与硬件设备进行通信,比如Arduino控制器、传感器或其他支持串行接口的设备。在Mac上进行Java串口编程时,开发者通常会借助第三方库或者Java的...
### Java串口编程起步知识点详解 #### 一、引言 串口通信是电子设备间进行数据交换的一种常见方式,特别是在工业控制、自动化系统及物联网领域应用广泛。Java作为一种跨平台的语言,在串口编程方面也提供了强大的...
Java串口编程是一种在Java应用程序中与硬件设备进行通信的技术,尤其适用于嵌入式系统、自动化设备或物联网(IoT)应用。Java提供了一个名为`javacomm`的API,它使得开发者能够处理串行端口(串口)的数据传输。在给定...
RXTX java串口编程jar包RXTX java串口编程jar包RXTX java串口编程jar包RXTX java串口编程jar包RXTX java串口编程jar包RXTX java串口编程jar包
从最基础的串口通信介绍如何用java去实现,知道了串口通信的原理之后再用代码实现应该就是最简单的事情了吧
Java串口编程是一种在Java应用程序中与物理串行端口进行通信的技术,广泛应用于设备控制、数据采集和物联网(IoT)项目。串口驱动,也称为串行端口驱动,是实现这种通信的关键组件。在Java中,我们通常使用第三方库如...
Java串口编程是一种在Java应用程序中与硬件设备进行通信的技术,通常用于嵌入式系统、自动化设备或物联网(IoT)应用。这个"CaseSync"可能是项目案例或示例代码的名称,暗示了该压缩包可能包含了一个实现串口通信功能...
2. **Java串口编程** 在Java中,`javax.comm`库提供了串口编程的支持。然而,这个库已经不再维护,因此现代的Java开发者通常使用第三方库如RXTX或jSerialComm。这些库提供了方便的API来打开、配置和读写串口。 -...
Java串口编程是在Java中与外部设备进行通信的一种方式,通常用于硬件设备如传感器、打印机、GPS模块等的交互。在Java中,这一功能主要通过Java通信API(javax.comm)来实现。以下是对给定代码的详细解析: 1. **...