窝囊废 发表于 2007-12-8 20:53

Java问题,比较头疼

我之前学做做过一些独立运行的小程序,
但是最近有个project, 需要编写一个射频卡(RFID)管理的程序,而射频卡读取器硬件是通过USB与电脑连接, 如何通过Java才能对硬件进行调动呢, 总觉得抓不着头绪, 无从下手,希望哪位高人给指条路:) :) :)

天上的一片云 发表于 2007-12-8 22:11

Java调动硬件是个软项,为什么不用C来做?

窝囊废 发表于 2007-12-8 22:35

回复 #2 天上的一片云 的帖子

教授要求要用java, 另外C我只会点皮毛$汗$

康猪 发表于 2007-12-8 22:38

有意思,没有做过,应该有相应包吧,关注:)

klsharp 发表于 2007-12-9 01:53

只能用JNI调用,WINDOWS下通过JNI访问用C这类语言编写好的dll就能调用本地硬件了

理论上HO

[ 本帖最后由 klsharp 于 2007-12-9 01:54 编辑 ]

康猪 发表于 2007-12-9 03:34

说道jni让我很头大。只记得对c compiler的依赖很高。代码又及其丑陋。以前有个项目用vc compile的程序调java ok.反过来死活不出来。

后来一直从事纯java框架。还好还好。

窝囊废 发表于 2007-12-9 10:34

原帖由 klsharp 于 2007-12-9 01:53 发表 http://www.dolc.de/forum/images/common/back.gif
只能用JNI调用,WINDOWS下通过JNI访问用C这类语言编写好的dll就能调用本地硬件了

理论上HO

我在网上也查了下, 看来也只能用jni了$汗$
$握手$ $握手$ $送花$

rofole 发表于 2007-12-13 00:39

JNI是一个可能性.
但是也可以用java串口通信。试过感觉功能不是很好。
RFID Reader 可以用HyperTerminal来测试,或者控制。
Reader 所作的就是首先初始化端口,然后监听端口,有数据来的时候分析数据。
这是我以前做的,希望能有所帮助


import java.io.IOException;
import java.io.InputStream;
import java.util.Enumeration;
import java.util.TooManyListenersException;

import javax.comm.CommPortIdentifier;
import javax.comm.PortInUseException;
import javax.comm.SerialPort;
import javax.comm.SerialPortEvent;
import javax.comm.SerialPortEventListener;
import javax.comm.UnsupportedCommOperationException;

import RFIDReader.BookshelfSpace;

public class Reader implements SerialPortEventListener {
        private Enumeration portList;

        private CommPortIdentifier portId;

        private SerialPort serialPort;

        private InputStream inputStream;

        private String portName;
        private BookshelfSpace space;
        private static int WAIT_TIME = 2000;

        public static void main(String[] args) {
//                if(args.length!=2)
//                {
//                        System.out.println("Error:invalidated arguments:");
//                        System.out.println("Usage: Reader portName url");
//                        System.exit(1);
//                }
//                String portName=args;
//                String url=args;
                new Reader("COM4");
                // "/dev/term/a" //linuxs
        }

        Reader(String portName) {
                this.portName = portName;
                portList = CommPortIdentifier.getPortIdentifiers();
                while (portList.hasMoreElements()) {
                        portId = (CommPortIdentifier) portList.nextElement();
                        if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
                                if (portId.getName().equals(portName)) {
                                        read();
                                }
                        }
                }

        }

        public void read() {
                try {
                        serialPort = (SerialPort) portId.open("RfidReader", WAIT_TIME);
                } catch (PortInUseException e) {
                }
                try {
                        serialPort.setSerialPortParams(9600, SerialPort.DATABITS_8,
                                        SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
                } catch (UnsupportedCommOperationException e) {
                }
                serialPort.notifyOnDataAvailable(true);
                try {
                        inputStream = serialPort.getInputStream();
                       
                        byte[] readBuffe = new byte;
                        if (inputStream.available() > 0) {
                                int numBytes = inputStream.read(readBuffe);
                                System.out.print("Reader Version:"+new String(readBuffe));
                        }

                } catch (IOException e) {
                }
                try {
                        serialPort.addEventListener(this);
                        System.out.println(" Reader initialized.");
                } catch (TooManyListenersException 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;

                        try {
                                while (inputStream.available() > 0) {
                                        int numBytes = inputStream.read(readBuffer);
                                }
                                System.out.print(new String(readBuffer));
                        } catch (IOException e) {
                        }
                        break;
                }
        }

}

并非如此 发表于 2007-12-13 13:17

都说了用usb接口了,还有啥好说的。
其实不管是什么接口传到pc的数据,基本都是现在pc 内存里建立虚拟文件,读取数据的方法和读取文件基本类似,只是不同端口的虚拟文件名不一样而已,在java立,一般常用的端口都是相应的封装好的类,肯定不必自己开发。

herzog 发表于 2008-1-5 12:28

楼上是个明白人!
页: [1]
查看完整版本: Java问题,比较头疼