Java串口通信编程指南
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java串口通信编程指南
1. 概述
在java中,利用Java Communication包可以操作串口,但官方的包在3.0之后就只支持Linux和Solaris平台了,Windows平台的只支持到98年出的2.0版本,不过在XP下还能使用。另外,也可以用开源的Rxtx实现串口通信,这里仅以Java Communication包,在Windows 平台实现串口通信进行说明。
2. 前期准备
2.1. 下载Java Communication包
✧下载地址如下:/Jolt/javacomm20-win32.zip。
✧如果是非Windows平台,请到Sun网站选择其他版本下载。地址如下:
/download/products.xml?id=43208d3d
2.2. 配置
✧解压缩javacomm20-win32.zip
✧把win32com.dll拷贝到{JAVA_HOME}\jre\bin
✧把comm.jar拷贝到{JAVA_HOME}\jre\lib\ext
✧把m.properties拷贝到{JAVA_HOME}\jre\lib
✧set CLASSPATH={JAVA_HOME}\jre \lib\ext \comm.jar;%classpath%
3. 实现过程
主要步骤包括:
✧获得串口标识
✧打开串口
✧设置串行端口通讯参数
✧获取输入(出)流
✧进行读写操作
3.1. 获得串口标识
指定串口的端口号,生成串口的标识类的实例。
mPortIdentifier是通讯端口管理器,控制访问到通讯端口的中心类。一个应用程序首先使用CommPortIdentifier中的方法,通过相关的驱动去获取那些通讯端口是可用的并且选择一个端口便于开始。它包括如下功能:
a. 通过驱动决定通讯端口是可用的。
b. 打开通讯端口为了I/O操作。
c. 决定端口的拥有者。
d. 解析端口拥有者的争夺。
e. 管理事件显示在端口拥有者的中的状态改变。
示例代码如下:
代码:
3.2. 打开串口
示例代码如下:
代码:
5000(毫秒)是超时时间。
3.3. 设置串行端口通讯参数
设置串口传输的波特率、数据位、停止位、奇偶校验等参数。
示例代码如下:
代码:
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);
}
3.4. 获取输入(出)流
利用getInputStream()以及getOutputStream()从每个串口产生对应的输入输出流对象。示例代码如下:
代码:
//受信バッファ
protected BufferedReader comReader;
//送信バッファ
protected BufferedOutputStream comWriter;
try {
// RS-232C 入力用の Reader を生成
comReader = new BufferedReader(
new InputStreamReader(port.getInputStream()));
// RS-232C 出力用の Writer を生成
comWriter=
new BufferedOutputStream(port.getOutputStream());
} catch (IOException ex){
ex.printStackTrace();
3.5. 进行读写操作
✧写操作很简单,只需要调用BufferedOutputStream的write()方法就可以了。
示例代码如下:
代码:
✧读操作,需要如下步骤:
✓继承SerialPortEventListener接口。
✓为SerialPort添加监听Listener。
✓实现该接口的serialEvent(SerialPortEvent event)方法。
✓通过BufferedReader的read()方法逐byte读取。当然也可以用readLine()方法进行逐行读取。
示例代码如下:
代码:
public class SerialPortTerminal extends SerialPortHandler
implements
SerialPortEventListener {
//受信バッファ
protected BufferedReader comReader;
//送信バッファ
protected BufferedOutputStream comWriter;
public SerialPortTerminal(String portName){
super(portName,
"SerialPortTerminal");
try {
// SerialPortEvent を受け取るためのリスナの登録
port.addEventListener(this);
} catch(TooManyListenersException ex){
ex.printStackTrace();
System.exit(1);
}
// Data Available イベントを受け取るようにする