我现在在学习串口通信功能,为此我下载了comm.jar包,根据里面的样例我写了个小程序,代码如下:package uarttest;import java.io.*;
import java.util.*;
import javax.comm.*;/**
*
* @author dennis
*/
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList; InputStream inputStream;
SerialPort serialPort;
Thread readThread; public static int byte2int(byte[] res)
{
int firstByte = (0x000000FF & ((int)res[0]));
int secondByte = (0x000000FF & ((int)res[1]));
int anUnsignedInt = ((int) (firstByte << 8 | secondByte))
& 0xFFFFFFFF;
return anUnsignedInt;
} public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
} public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
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:
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:
byte[] readBuffer = new byte[2];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(byte2int(readBuffer));
} catch (IOException e) {}
break;
}
}
}
通过这个类接收发送到串口COM1的数据,并显示出来。我现在想把这个功能集中到struts项目中,在页面中实时显示所接受到的数据。但是这个类中包含有MAIN函数,我不知道该怎么做。串口通信有2种方式,一种是实现SerialPortEventListener接口,监听各种串口事件并作相应处理;另一种就是建立一个独立的接收线程专门负责数据的接收。看到SerialPortEventListener接口我就想到了servlet中的Listener,通过查找API,发现他们都继承自java.util.EventListener接口。
我想是不是可以把这个类配置到struts的Listener中,因为还没开始做项目,不知道这个办法是否可行,有没有做过这方面的朋友给个建议。第二种方法是建立一个独立的接收线程专门负责数据的接收。我对多线程了解的不多,更不知道struts项目中怎么添加一个一直运行的线程。 在struts项目中,以上两种方法是否可行?哪种方法比较好呢?有没有做过相关项目的人给点经验啊,谢谢了。
import java.util.*;
import javax.comm.*;/**
*
* @author dennis
*/
public class SimpleRead implements Runnable, SerialPortEventListener {
static CommPortIdentifier portId;
static Enumeration portList; InputStream inputStream;
SerialPort serialPort;
Thread readThread; public static int byte2int(byte[] res)
{
int firstByte = (0x000000FF & ((int)res[0]));
int secondByte = (0x000000FF & ((int)res[1]));
int anUnsignedInt = ((int) (firstByte << 8 | secondByte))
& 0xFFFFFFFF;
return anUnsignedInt;
} public static void main(String[] args) {
portList = CommPortIdentifier.getPortIdentifiers(); while (portList.hasMoreElements()) {
portId = (CommPortIdentifier) portList.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
if (portId.getName().equals("COM1")) {
//if (portId.getName().equals("/dev/term/a")) {
SimpleRead reader = new SimpleRead();
}
}
}
} public SimpleRead() {
try {
serialPort = (SerialPort) portId.open("SimpleReadApp", 2000);
} catch (PortInUseException e) {}
try {
inputStream = serialPort.getInputStream();
} catch (IOException e) {}
try {
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:
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:
byte[] readBuffer = new byte[2];
try {
while (inputStream.available() > 0) {
int numBytes = inputStream.read(readBuffer);
}
System.out.print(byte2int(readBuffer));
} catch (IOException e) {}
break;
}
}
}
通过这个类接收发送到串口COM1的数据,并显示出来。我现在想把这个功能集中到struts项目中,在页面中实时显示所接受到的数据。但是这个类中包含有MAIN函数,我不知道该怎么做。串口通信有2种方式,一种是实现SerialPortEventListener接口,监听各种串口事件并作相应处理;另一种就是建立一个独立的接收线程专门负责数据的接收。看到SerialPortEventListener接口我就想到了servlet中的Listener,通过查找API,发现他们都继承自java.util.EventListener接口。
我想是不是可以把这个类配置到struts的Listener中,因为还没开始做项目,不知道这个办法是否可行,有没有做过这方面的朋友给个建议。第二种方法是建立一个独立的接收线程专门负责数据的接收。我对多线程了解的不多,更不知道struts项目中怎么添加一个一直运行的线程。 在struts项目中,以上两种方法是否可行?哪种方法比较好呢?有没有做过相关项目的人给点经验啊,谢谢了。
谢谢老紫竹的回答,久仰大名。1长连接。项目对实时的要求并不高。我单片机程序中设定的是5秒发送一次数据,所以我感觉第二种方法更适合。
2客户端定时查询后台程序。 这个是将这个类改为工具类吗?后台程序定时调用这个类,返回得到的数据?在没有调用的时候,这个实现了SerialPortEventListener,Runnable接口的类是不是就不在工作了?这个类可不可以配置到struts的Listener中实现类似servlet中Listener的功能呢?呵呵,刚接触到这方面的东西,问题有点多,网上也很难找到合适的答案。希望老紫竹大哥能多指点指点。
我也考虑过SWING,但是我对SWING了解的并不是很多,只跟着样例做过个比较简单的东西。
如果有比较好的SWING入门书籍的话可以推荐下哈。
建议你,前台页面操作串口还是用JS实现比较好,而且桌面程序也不要用sun提供的comm.jar这个包,用的话可以选择RXTX.jar这个包,这个包封装的要比sun提供的comm.jar好,功能虽然类似,但效率高。
谢谢你的建议,我刚才查了一下,RXTX.jar直接替换comm.jar就可以了。
看来我还没找对方向。有没有相关方面的论坛或者网站呢?
一般涉及到串口操作的,使用桌面程序的比较多么?