我现在在学习串口通信功能,为此我下载了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项目中,以上两种方法是否可行?哪种方法比较好呢?有没有做过相关项目的人给点经验啊,谢谢了。

解决方案 »

  1.   


    谢谢老紫竹的回答,久仰大名。1长连接。项目对实时的要求并不高。我单片机程序中设定的是5秒发送一次数据,所以我感觉第二种方法更适合。
    2客户端定时查询后台程序。  这个是将这个类改为工具类吗?后台程序定时调用这个类,返回得到的数据?在没有调用的时候,这个实现了SerialPortEventListener,Runnable接口的类是不是就不在工作了?这个类可不可以配置到struts的Listener中实现类似servlet中Listener的功能呢?呵呵,刚接触到这方面的东西,问题有点多,网上也很难找到合适的答案。希望老紫竹大哥能多指点指点。
      

  2.   


      我也考虑过SWING,但是我对SWING了解的并不是很多,只跟着样例做过个比较简单的东西。
      如果有比较好的SWING入门书籍的话可以推荐下哈。
      

  3.   


    建议你,前台页面操作串口还是用JS实现比较好,而且桌面程序也不要用sun提供的comm.jar这个包,用的话可以选择RXTX.jar这个包,这个包封装的要比sun提供的comm.jar好,功能虽然类似,但效率高。
      

  4.   


    谢谢你的建议,我刚才查了一下,RXTX.jar直接替换comm.jar就可以了。
    看来我还没找对方向。有没有相关方面的论坛或者网站呢?
    一般涉及到串口操作的,使用桌面程序的比较多么?
      

  5.   

    JS操作串口的DEMO,网上有很多的,你仔细找一下就能找到了。另外,除了JS外,JApplet(Applet)好像也能实现,只不过需要客户端要有含串口操作包(rxtx或comm.jar)的JRE;此外,除了JS和applet,就只能你自己写一个ActiveX控件来实现了。
      

  6.   

    modbus协议有用过的么。好像有个jamod.jar的开源包