Java串行通信类的设计与应用

(整期优先)网络出版时间:2009-06-06
/ 2
摘 要 Java语言具有一次编译、到处运行的特性,并广泛应用于嵌入式系统中。本文在NetBeans 5.0环境下实现了通用的串行通信类,可以方便地发送和读取任何字节,并给出了应用实例和测试效果。该技术可以广泛应用于基于Java的嵌入式设备的二次开发中。
关键词 串行通信,串口初始化,多线程,数据接收

一、引言
Java程序具有一次编译、到处运行的跨平台特性,随着Java在嵌入式系统中的广泛应用,研究Java的串行通信程序具有日益重要的意义。文献[1]实现了基于Java事件驱动的串行通信,在该文献及Sun公司中国技术社区的蒋清野的基础之上,设计了通用的串行通信类,跟文献[2]相比,这些类更简洁、健壮,而且,可以方便地处理任何字节,并可以将一批数据作为一个整体来提交,方便用户的下一步处理。这里的通用串口类由两个Java类组成,OperateCOM类用来初始化串口,并启动数据接收进程;ReadCOM类用来读取串口数据,并将一批数据作为整体提交。SerialExample类利用OperateCOM和ReadCOM类进行串行通信的测试,并利用文献[3]中的工具进行各种格式的显示。

二、OperateCOM类
OperateCOM与ReadCOM类的包名均为SerialPort。OperateCOM类主要完成的工作是:取得串口ID、打开串口、获取输入输出流、设置串口参数、启动串口数据读取进程。然后,就是常用的读取串口数据、从串口发送数据,以及关闭串口。下面对其方法分别介绍如下:
1.public OperateCOM (int PortID, int nLen )
这是OperateCOM类的构造方法,PortID表示需要操作的串口号,“1”表示“COM1”,“2”表示“COM2”……以此类推;nLen表示串口的输入缓冲区大小,最小值为1。构造方法的源代码如下:
public OperateCOM(int PortID, int nLen) {
PortName = "COM"+PortID;
nMaxLength = nLen;
if (nLen < 1) nMaxLength = 1;
}

2.public int GetPortID()
该方法通过串口名字,如COM1,取得串口的ID,如果正确则返回Serial_Success(常数1);如果错误,则抛出没有此串口的异常NoSuchPortException,并返回Serial_Error(常数-1),其源代码如下:
public int GetPortID(){
try {
portID = CommPortIdentifier.getPortIdentifier(PortName);
} catch (NoSuchPortException e) {
return Serial_Error;
}
return Serial_Success;
}

3.public int Open(String AppName, int nTime)
该方法通过获取的串口portID打开串口,输入参数AppName是程序的名称,nTime表示延迟的毫秒数。如果该串口正在被使用,则会抛出PortInUseException异常;如果打开串口成功,则根据serialPort继续获取串口的输入输出流,其源代码如下:
public int Open(String AppName, int nTime){
try {
serialPort = (SerialPort)portID.open(AppName, nTime);
} catch (PortInUseException e) {
return Serial_Error;
}

try {
in = serialPort.getInputStream();
out = serialPort.getOutputStream();
} catch (IOException e) {
return Serial_Error;
}
return Serial_Success;
}

4.public int SetParams(int baudrate, int dataBits, int stopBits, int parity)
该方法用来设置串口参数。输入参数分别对应波特率、数据位、停止位和校验方式。在Java Communications API的Javadoc中,有相应的常数代号,例如,DATABITS_8表示整数8,STOPBITS_1表示整数1等。源代码如下:
public int SetParams(int baudrate, int dataBits, int stopBits, int parity){
try {
serialPort.setSerialPortParams(baudrate, dataBits, stopBits, parity);

} catch (UnsupportedCommOperationException e) {
return Serial_Error;
}
return Serial_Success;
}

5.public void StartCom(int nDelay)
该方法启动数据接收进程,nDelay是延迟的毫秒数,表示凡是时间间隔在nDelay毫秒之内的数据,都作为一个整体来处理。从文献[1]中的测试效果可知,串行通信的数据确实是不连续的,需要进行累加处理。ReadCOM是Thread类的子类,本方法根据给定的参数,生成一个多线程的实例,并启动多线程。OperateCOM类直接控制ReadCOM类的实例的生成、多线程的销毁与数据的读取等。StartCom的源代码如下:
public void StartCom(int nDelay){
readThread = new ReadCOM(in, nDelay, nMaxLength);
readThread.start();
}