我是将本机串口收发直接短接做测试,可是读取数据时要丢失,我的机制可能有问题,时间上总是不能把握好,而且每次都将前边的14个字符大小的数据丢失,请问各位怎么解决这个问题,有更好方案请指教;代码如下:
package com.serial;import java.io.*;
import java.util.*;
import javax.comm.*;public class SerialBean implements Runnable, SerialPortEventListener
{
    static String PortName;    static StringBuffer ReadBuffer;    public static String buffer = "";    public boolean IsRun = false;    CommPortIdentifier portId;    SerialPort serialPort;    static OutputStream out;    static InputStream in;    static boolean IsAvailable = false;//数据有效标记    SerialBuffer SB;    ReadDataThread RT;    Thread readThread;    static Enumeration CommList; //CommList取得机器上所有端口的列表    public SerialBean()
    {    }    /*
     * 获取 本机所有串口 参数:无 返回:串口列表
     */
    public String[] GetLocalCOM()
    {
        CommList = CommPortIdentifier.getPortIdentifiers();
        String[] comList = new String[10];
        for (int i = 0; i < comList.length; i++)
        {
            comList[i] = "";
        }
        int i = 0;
        while (CommList.hasMoreElements())
        {
            portId = (CommPortIdentifier) CommList.nextElement();
            if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL)
            {
                comList[i] = portId.getName();
                i++;
            }
        }
        return comList;
    }    /*
     * 打开,初始化指定串口
     * 
     * 参数:portNo:串口号;baudRate:波特率;dataBits:数据位;stopBits:停止位;parity:奇偶校验
     * 
     * 返回:1:成功;-1:失败
     * 
     * 说明:每打开一个即开启该串口的接收线程
     *  
     */
    public int Initialize(int portNo, int baudRate, int dataBits, int stopBits, int parity)
    {
        int InitSuccess = 1;
        int InitFail = -1;
        try
        {
            portId = CommPortIdentifier.getPortIdentifier("COM" + portNo);//serialPort.
            if (portId.isCurrentlyOwned())
            {
                return InitFail;
            }
            try
            {
                serialPort = (SerialPort) portId.open("SerialTest", 10000);            } catch (PortInUseException e)
            {
                return InitFail;
            }
            try
            {
                in = serialPort.getInputStream();
                out = serialPort.getOutputStream();
            } catch (IOException e)
            {
                return InitFail;
            }            try
            {
                serialPort.addEventListener(this);
            } catch (TooManyListenersException e)
            {
            }
            serialPort.notifyOnDataAvailable(true);            try
            {
                serialPort.setSerialPortParams(baudRate, dataBits, stopBits, parity);
            } catch (UnsupportedCommOperationException e)
            {
                return InitFail;
            }            readThread = new Thread(this);
            readThread.start();//开启该串口的接收线程        } catch (NoSuchPortException e)
        {
            return InitFail;
        }        return InitSuccess;
    }    /* 侦听串口事件,数据有效时读,保存到缓冲区:ReadBuffer */
    public void serialEvent(SerialPortEvent event)
    {
        StringBuffer inputBuffer = new StringBuffer();
        int newData = 0;        switch (event.getEventType())
            {
             case SerialPortEvent.DATA_AVAILABLE:
                buffer="";
                byte[] readBuffer = new byte[10000];
                try
                {
                    in = serialPort.getInputStream();
                } catch (IOException e)
                {
                }
                try
                {
                    while (in.available() > 0)
                    {
                        int numBytes = in.read(readBuffer);
                        try
                        {
                            Thread.sleep(100);
                        } catch (InterruptedException e)
                        {
                        }
                    }                } catch (IOException e)
                {
                }
                buffer = new String(readBuffer);
                IsAvailable = true;
                break;
            }
    }    /*
     * 读串口数据
     */
    public synchronized String ReadData()//(String COMNo)
    {
        while(readThread.isAlive() && !IsAvailable)
        {
            if (IsAvailable)
            {
                IsAvailable = false;
            }
        }
        return buffer;//ReadBuffer.toString();
    }    public void run()
    {
        try
        {
            Thread.sleep(20000);
        } catch (InterruptedException e)
        {
        }
    }
    public synchronized void WritePort(String Msg)//写数据
    {
        try
        {
           out.write(Msg.getBytes());
        } catch (IOException e)
        {
        }
    }
    public void ClosePort()
    {
        IsRun = false;
        serialPort.close();    }}