四、 使用Java通讯API开发短信软件
和访问网络资源一样,和COM口通讯的第一步必须要打开某一个COM口。因此,我们首先需要一个可以操作COM口的类,我们叫它MySerial(这将是我们实现的第一个Java类)。
上面实现的类是我们的核心类,它的主要功能之一就是初始化COM口,并保证COM口可以正常使用。我们可以发现,在MySerial类中还调用了两个类:SerialBuffer和readSerial。下面就来实现这两个类。package com.message import Java.io.*; import Java.util.*; import Javax.comm.*; public class MySerial ...{ private String portName; private CommPortIdentifier portId; private SerialPort serialPort; private OutputStream out; private InputStream in; SerialBuffer serialBuffer; // SerialBuffer类在后面实现 ReadSerial readSerial; // ReadSerial在后面实现 /**//* 这个方法是MySerial的构造函数,参数port表示COM口,1:COM1,2:COM2, 以此类推。在这个类中设置了COM口名:portName。portName必须是这种格式,因为getPortIdentifier方法要使用它 */ public MySerial(int port) ...{ portName = "COM" + port; } /**//** 这个函数初始化了COM口,也就是我们所说的打开COM口,并得到用于和COM口通讯的输入、输出流。 */ public int Initialize() ...{ private int success = 1; private int fail = -1; try ...{ // 根据portName得到COM的标识对象 portId = CommPortIdentifier.getPortIdentifier(portName); try ...{ // 打开COM口, open方法的第二个参数是超时时间,单位是毫秒。 // 在本程序中超时时间是5秒 serialPort = (SerialPort) portId.open("Serial_Communication", 5000); } catch (PortInUseException e) ...{ return fail; } // 下面是得到用于和COM口通讯的输入、输出流。 Try ...{ in = serialPort.getInputStream(); out = serialPort.getOutputStream(); } catch (IOException e) ...{ return fail; } // 下面是初始化COM口的传输参数,如传输速率:9600等。 try ...{ serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE); } catch (UnsupportedCommOperationException e) ...{ return fail; } } catch (NoSuchPortException e) ...{ return fail; } // 当上面的代码执行成功后,将建立一个数据缓冲区,然后启动 // 一个线程,用于接收从COM 口传回的数据 serialBuffer = new SerialBuffer(); readSerial = new ReadSerial(serialBuffer, in); readSerial.start(); return success; } // 这个方法从COM口读出length个字符 public String readPort(int length) ...{ String msg; msg = getMsg(Length); return msg; } // 这个函数向COM口写入一个字符串 public void writePort(String msg) ...{ int c; try ...{ for (int i = 0; i < msg.length(); i++) ...{ out.write(msg.charAt(i)); } } catch (IOException e) ...{} } // 关闭正在使用的COM口 public void closePort() ...{ readSerial.stop(); serialPort.close(); } }