该如何去读取串口数据,最好能有编码和说明!菜鸟在做一个java串口调试小工具,希望能得到高手的指点。

解决方案 »

  1.   

    import java.io.*;
    import java.util.*;
    import javax.comm.*;public class SerialBean implements Runnable,SerialPortEventListener
    {
    String PortName;
    int baud;
    CommPortIdentifier portId;
    SerialPort serialPort;
    static OutputStream out;
    static InputStream in;
    String Buf=null;// 缓存一条最新信息
    boolean hasData=false;// 标志有无新数据
    StringBuilder buf=new StringBuilder(128);
    Thread readThread; public SerialBean(int PortID,int baud)
    {
    PortName="COM"+PortID;
    this.baud=baud; }

    public int Initialize()
    {
    int InitSuccess=1;
    int InitFail=-1;
    try
    {
    portId=CommPortIdentifier.getPortIdentifier(PortName);
    try
    {
    serialPort=(SerialPort)portId.open("Serial_Communication",2000);
    serialPort.setSerialPortParams(this.baud,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);
    serialPort.addEventListener(this);
    serialPort.notifyOnDataAvailable(true);
    }
    catch(PortInUseException e)
    {
    return InitFail;
    }
    catch(TooManyListenersException e)
    {
    return InitFail;
    }
    catch(UnsupportedCommOperationException e)
    {
    return InitFail;
    }
    try
    {
    in=serialPort.getInputStream();
    out=serialPort.getOutputStream();
    }
    catch(IOException e)
    {
    return InitFail;
    } }
    catch(NoSuchPortException e)
    {
    return InitFail;
    }
    readThread=new Thread(this);
    readThread.start();
    return InitSuccess;
    }

    public boolean hasData()
    {
    return hasData;
    }
    public String ReadPort()
    {
    if(hasData)
    {
    this.hasData=false;
    return this.Buf;
    }
    else
    return null;
    } @SuppressWarnings("deprecation")
    public void ClosePort()
    {
    if(readThread!=null )
    readThread.stop();
    if(serialPort!=null)
    serialPort.close();
    }
    @Override
    public void serialEvent(SerialPortEvent event)
    {
    /**
     * 事件类型:
     * 
     * BI -通讯中断.    CD -载波检测.    CTS -清除发送.    DATA_AVAILABLE -有数据到达.   
     * DSR-数据设备准备好.    FE -帧错误.    OE -溢位错误.    OUTPUT_BUFFER_EMPTY
     * -输出缓冲区已清空.    PE -奇偶校验错. RI - 振铃指示.
     */
    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
    {
    char b;
    while(in.available()>0)
    {
    b=(char)in.read();
    buf.append(b);
    }
    int beg=0,end=0;
    for(int i=0;;i++)
    {
    if(buf.length()<2)
    {
    return;
    }
    if(buf.charAt(0)=='\r'&&buf.charAt(1)=='\n')// 以回车换行开头
    {
    beg=2;
    }
    else
    // 不以换行开头
    {
    beg=0;
    }
    end=buf.indexOf("\r\n",beg);
    if(end==-1)// 未接受完一整条信息
    break;
    Buf=buf.substring(beg,end);// 截取数据
    buf.delete(0,end+2);// 删除已用数据
    System.out.printf("--%s--\n",Buf);
    this.hasData=true; } // System.out.println(con);
    }
    catch(IOException e)
    {
    }
    break;
    }
    } public void run()
    {
    try
    {
    Thread.sleep(2000);
    }
    catch(InterruptedException e)
    {
    }
    }
    }
      

  2.   

    楼上的需要一个包
    http://www.oracle.com/technetwork/java/index-jsp-141752.html
      

  3.   

    使用rxtx包做串口开发,比官方的要好一些。