为了方便您阅读,将问题细致如下(高手喜欢难题,但是希望这样的题目不会难到高手~~):
功能说明:程序的功能是用javax.comm实现计算机与串口的通信。连接到电脑上的串口为COM3。
问题说明:首先,硬件之间的通信规则是:
要在所有的端口中通过枚举的方法找到COM3,这时要调整serialPort的参数如下:
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_MARK);
其次,要发送硬件识别的地址,在COM3上连接的硬件需要PC的指令激活。
命令为16进制的1byte数据:0xFF
这样的命令送到COM3上,该硬件将自动将自己的串口参数改为(19200,8,1,S)。
再次,调整PC上的serialPort参数:
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_SPACE);
这时,二者的信道参数配置一样了,可以通信了!
最后,由PC传递命令,例如想获得该硬件的ID可以发如下的5byte命令:
0x80+0x00+0x00+0x00+0x80.这时,硬件将该数据送到COM3.
调试结果:
COM3已经被打开了!
硬件地址已经发送!
javax.comm.UnsupportedCommOperationException: Unsupported parity value at com.sun.comm.Win32SerialPort.setSerialPortParams(Win32SerialPort.java:268)
at SimpleSerial.checkSerialPort(SimpleSerial.java:61)
at SimpleSerial.<init>(SimpleSerial.java:35)
at SimpleSerial.main(SimpleSerial.java:165)
javax.comm.UnsupportedCommOperationException: Unsupported parity value at com.sun.comm.Win32SerialPort.setSerialPortParams(Win32SerialPort.java:268)
at SimpleSerial.checkSerialPort(SimpleSerial.java:85)
at SimpleSerial.<init>(SimpleSerial.java:35)
at SimpleSerial.main(SimpleSerial.java:165)
Exception in thread "main" java.lang.NullPointerException at SimpleSerial.checkSerialPort(SimpleSerial.java:118)
at SimpleSerial.<init>(SimpleSerial.java:35)
at SimpleSerial.main(SimpleSerial.java:165)
获得读卡器ID命令已经发送!
该函数的几处异常找了网上的资料,原来是和先后经过奇偶校验的参数改变有关。但是并没有找到解决的方案。
最后将整体的代码贴出:
import java.io.*;
import java.util.*;
import javax.comm.*;
public class SimpleSerial {
/* 变量定义 */
CommPortIdentifier portId;
Enumeration portList;
OutputStream outputStream;
InputStream inputStream;
byte[] readBuffer = new byte[60];
String str = "";
byte data[] ;
SerialPortEventListener EventListener;
SerialPortEvent event;
SerialPort serialPort;
boolean flag;
public SimpleSerial(){
checkSerialPort();
}
public void checkSerialPort() {
portList = CommPortIdentifier.getPortIdentifiers();
//检查是否具有通信的端口
if (portList == null) {
System.out.println("没有通信端口!程序结束!");
//System.exit(0);
}
while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM3")) {
//该端口已经被占用了?
if (portId.isCurrentlyOwned()) {
System.out.println("对不起!" + portId.getName()
+ "已经被占用了!");
}
try {
serialPort = (SerialPort) portId.open("SimpleSerial",15000);
System.out.println("COM3已经被打开了!");
} catch (PortInUseException e) {
}
try {
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_MARK);
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
try {
outputStream = serialPort.getOutputStream();
outputStream.write(0xff);
System.out.println("广播地址已经发送!");
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//延时5s
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
//开始向函数发送获得读卡器ID的命令
try {
serialPort.setSerialPortParams(19200,
SerialPort.DATABITS_8, SerialPort.STOPBITS_1,
SerialPort.PARITY_SPACE);
} catch (UnsupportedCommOperationException e) {
e.printStackTrace();
}
try {
outputStream = serialPort.getOutputStream();
outputStream.write(0x80);
outputStream.write(0x00);
outputStream.write(0x00);
outputStream.write(0x00);
outputStream.write(0x80);
System.out.println("获得读卡器ID命令已经发送!");
} catch (IOException e) {
e.printStackTrace();
}
//接受信息
try {
inputStream = serialPort.getInputStream();
} catch (IOException a) {
}
/*设置SerialPortEventListener,获取数据,并送显!*/
try {
serialPort.addEventListener(EventListener);
} catch (TooManyListenersException e) {}
/* 侦听到串口有数据,触发串口事件*/
serialPort.notifyOnDataAvailable(true);
switch (event.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try {
while (inputStream.available() > 0) {
System.out.println("已经获得读卡器信息");
int DeviceID = inputStream.read(readBuffer);
str=new String(readBuffer);
}
} catch (IOException e) {
}
/* 接收到的数据存放到文本区中 */
System.out.println("读卡器的ID已经送显:");
System.out.println(str);
try{
System.out.println("com3关闭程序结束!");
}catch(Exception ew){
ew.printStackTrace();
}
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
serialPort.close();
}
}
}
}
public void ClosePort(SerialPort serialPort)
{ serialPort=this.serialPort;
serialPort.close();
}
public static void main(String[] args){
SimpleSerial p=new SimpleSerial();
p.checkSerialPort();
System.out.println("程序结束!");
}
}
----------------------------------------------------------------------------------------------------
---------------------------------感谢赐教------------------------------------------------------------
-----------------------------------------------------------------------------------------------------