`
wuzhengfei
  • 浏览: 37521 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

Java串行通信,控制打印机

阅读更多

[size=small;]1、准备:[/size]
   1)、下载javacomm:
    需要到其官方主页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)。

   2)、安装
    这里的所谓安装就是把三个重要的文件放到指定的目录下。
    将下载的文件解压缩后,在\javacomm20-win32\commapi目录下有必需的三个文件comm.jar,javax.comm. properties和win32comm.dll。将文件comm.jar拷贝到%JAVA_HOME%\lib;文件 javax.comm. properties拷贝到%JAVA_HOME%\lib; 文件win32comm.dll拷贝到%JAVA_HOME%\bin。注意%JAVA_HOME%是jre的路径。

[size=small;]2、javax.comm简介:[/size]
    在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文档:http://java.sun.com/products/javacomm/reference/api/index.html


[size=small;]3、实例:[/size]
1)、Write:
import java.io.IOException;
import java.io.OutputStream;
import java.util.Enumeration;

import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.UnsupportedCommOperationException;


public class Write {
private Enumeration portList ;
private CommPortIdentifier portId ;
private SerialPort serialPort ;
private OutputStream os ;

public Write(String message){
/*
* 不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象。
* 注意这里的端口不仅仅是指串口,也包括并口。这个方法还可以带参数。getPortIdentifiers(CommPort)获得与已经被应用
* 程序打开的端口相对应的CommPortIdentifier对象。 getPortIdentifier(StringportName)获取指定端口名(比如“COM1”)
* 的CommPortIdentifier对象。
*/
portList = CommPortIdentifier.getPortIdentifiers() ;
while(portList.hasMoreElements()){
portId = portList.nextElement();
if(portId.getPortType() == CommPortIdentifier.PORT_SERIAL){
/*
* 找Windows下的第一个串口
*/
if(portId.getName().equalsIgnoreCase("COM1")){
/*
* 找Unix-like系统下的第一个串口
*/
// if (portId.getName().equals("/dev/term/a")) {
try{
/*
* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。如果端口正被其他应用程序占用,将使用
* CommPortOwnershipListener事件机制,传递一个PORT_OWNERSHIP_REQUESTED事件。每个端口都关联一个
* InputStream和一个OutputStream。如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据
* 流对象,除非有close被调用。有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。
*/
serialPort = (SerialPort) portId.open("Write", 2000) ;
/*
* 设置串口初始化参数,
* 依次是波特率
* 数据位
* 停止位和校验
*/
serialPort.setSerialPortParams(9600,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_NONE);
os = serialPort.getOutputStream() ;
os.write(message.getBytes()) ;
os.close() ;
serialPort.close() ;
}catch (PortInUseException e) {
System.out.println("COM1 正被使用!") ;
e.printStackTrace() ;
} catch (IOException e) {
System.out.println("获取输出流失败");
e.printStackTrace();
} catch (UnsupportedCommOperationException e) {
System.out.println("串行口初始化异常");
e.printStackTrace();
}
}
}
}
}
}

2)、Read:
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) {
/*
* 不带参数的getPortIdentifiers方法获得一个枚举对象,该对象又包含了系统中管理每个端口的CommPortIdentifier对象
* 。 注意这里的端口不仅仅是指串口,也包括并口。这个方法还可以带参数。getPortIdentifiers(CommPort)获得与已经被应
* 用程序打开的端口相对应的CommPortIdentifier对象。
* getPortIdentifier(StringportName)获取指定端口名(比如“COM1”)
* 的CommPortIdentifier对象。
*/
portList = CommPortIdentifier.getPortIdentifiers();
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)/* getPortType方法返回端口类型 */{
/* 找Windows下的第一个串口 */
// if (portId.getName().equals("COM1")){
/*
* 找Unix-like系统下的第一个串口
*/
if (portId.getName().equals("/dev/term/a")) {
Read reader = new Read();
}
}
}
}

public Read() {
try {
/*
* open方法打开通讯端口,获得一个CommPort对象。它使程序独占端口。如果端口正被其他应用程序占用,将使用
* CommPortOwnershipListener事件机制
* ,传递一个PORT_OWNERSHIP_REQUESTED事件。每个端口都关联一个
* InputStream和一个OutputStream
* 。如果端口是用open方法打开的,那么任何的getInputStream都将返回相同的数据
* 流对象,除非有close被调用。有两个参数,第一个为应用程序名;第二个参数是在端口打开时阻塞等待的毫秒数。
*/
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {
}
try {
inputStream = serialPort.getInputStream();/* 获取端口的输入流对象 */
} catch (IOException e) {
}
try {
/* 注册一个SerialPortEventListener事件来监听串口事件 */
serialPort.addEventListener(this);
} 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,响铃指示 */
/*
* Output buffer is empty,输出缓冲区清空
*/
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
/*
* Data available at the serial port,端口有可用数据。读到缓冲数组,输出到终端
*/
case SerialPortEvent.DATA_AVAILABLE:
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;
}
}
}

 

分享到:
评论

相关推荐

    java控制热敏打印机的例子

    Java本身并不直接支持硬件I/O操作,但可以通过第三方库如RXTX库来实现串行通信。RXTX是一个开源项目,提供了一组Java类,使得Java应用程序能够与串行端口(COM口)和并行端口进行通信。 在爱普生热敏打印机的案例中...

    Java调用小票打印机打印小票

    3. **串口通信**:小票打印机往往通过串行接口(如COM口)连接到电脑。Java中的`javax.comm`库可以用来处理串口通信,但需要注意的是,这个库并不包含在标准Java SDK中,可能需要额外下载和配置。 4. **文本格式化*...

    java调用并口打印机

    尽管如此,目前没有现成的库专门用于Java并口打印机控制。 3. **操作系统层面的解决方案**:在Windows系统中,可以通过创建虚拟打印机端口(例如,LP1)并将这个端口映射到并口打印机,然后使用Java的`java.awt....

    标签打印机JAVA串口打印源代码

    通过学习和理解这个DEMO,开发者可以学习到如何在JAVA中进行串口通信,以及如何构建针对特定打印机的控制逻辑。同时,"CommControl"可能是实现这一功能的关键类,包含了一系列串口控制操作,对于熟悉和实现串口打印...

    Java 调用标签打印机打印图片

    首先,Java作为一个跨平台的语言,它本身并不直接支持硬件级别的访问,例如打印机控制。为了实现这样的功能,通常我们需要借助于系统提供的API或者第三方库。在这个案例中,我们可能需要找到一个支持标签打印机的...

    java实现斑马打印机 ZPL指令打印条码.zip

    Java的`java.io`包提供了串行通信的支持,而`java.net`包则用于TCP/IP连接。 2. **构建ZPL指令字符串**:根据需求,编写ZPL指令字符串来定义条形码的样式和内容。例如: ``` ^XA ^BCN,50,Y,N,N ^FD12345678901^...

    java源码 JAVA串口通信源码 2018127

    总结来说,Java串口通信涉及的知识点包括Java编程、串行通信协议、RXTX库的使用以及事件驱动编程。`SerialPortDemo-master`项目提供了一个实际操作的例子,你可以通过研究该项目的源码,理解并学习如何在Java中实现...

    java串口通信程序

    Java串口通信是一种在计算机之间或计算机与外部设备(如传感器、打印机)之间进行数据交换的方法,它基于串行通信协议。在这个Java程序中,开发者使用了Java的标准库`javax.comm`来实现串口通信的功能,并结合Java的...

    java swing串口通信源码

    在Java Swing中实现串口通信可以帮助开发者创建能够与硬件设备交互的应用,例如读取或发送数据到通过串行端口连接的设备。本文将深入探讨如何使用Java Swing进行串口通信,以及涉及的相关技术。 首先,串口通信是一...

    双机间波特率可选的串行通信设计与调试-毕业论文.doc.zip

    串行通信是一种数据传输方式,其中数据一位接一位地按顺序发送,通常用于设备间的短距离通信,例如PC到打印机或两个微控制器之间的通信。 **串行通信基础** 串行通信分为同步串行和异步串行两种类型。异步串行通信...

    java串口通信.zip

    Java串口通信是一种在计算机与外部设备之间进行数据交换的技术,尤其适用于低速或中速的数据传输场景,如连接扫码枪、打印机等硬件设备。在本案例中,我们看到一个名为"java串口通信.zip"的压缩包,它可能包含了实现...

    java 串口通信 rxtx demo

    RXTX是一个开源的Java库,它提供了对串行(RS232)和并行(IEEE1284)通信的支持,使得Java开发者能够方便地进行串口通信。在这个“java 串口通信 rxtx demo”中,我们将深入探讨如何使用RXTX库来实现Java串口通信。...

    java 串口通信 完整demo

    Java串口通信是一种在计算机之间或计算机与外部设备(如传感器、打印机等)之间通过串行接口进行数据传输的技术。这个“java 串口通信 完整demo”提供了一个完整的示例,包括所有必要的依赖包,可以直接运行,并且带...

    java串口通信.pdf

    Java串口通信是Java编程语言中用于与外部设备交互的一种技术,主要应用于设备间的串行通信,如打印机、调制解调器等。Java提供了一个名为`javaCommunications API`的接口,允许开发者通过标准的Java程序来控制串口和...

    java串口通信API说明

    Java串口通信API是Java平台提供的一种用于与硬件设备进行串行通信的接口,主要包含在`javax.comm`包中。这个API允许开发者通过Java程序控制串行端口(如COM1、COM2等),实现与外部设备如打印机、GPS模块、Arduino板...

    java串口通信官网例子程序

    Java串口通信是一种在计算机之间或计算机与外部设备(如传感器、打印机等)之间通过串行接口进行数据传输的技术。这个“java串口通信官网例子程序”提供了学习和实践Java串口通信的基础示例,可以帮助开发者更好地...

    java串口通信 RXTXcomm.jar

    总之,RXTXcomm.jar是Java实现串口通信的关键组件,通过它,开发者可以轻松地在Java程序中实现与外部设备的串行通信,从而扩展应用的功能和范围。正确配置和使用RXTX库,可以让Java应用程序无缝地连接到各种串行设备...

    java串口通讯所需dll文件32位、64位

    串行通信常用于连接各种串行设备,如GPS模块、Modem、Arduino等,虽然速度较慢,但适应性广泛,适合远距离通信。 为了使Java程序能够利用RXTX进行串口通信,你需要按照以下步骤操作: 1. 首先,确认你的Java环境...

Global site tag (gtag.js) - Google Analytics