我是将本机串口收发直接短接做测试,可是读取数据时要丢失,我的机制可能有问题,时间上总是不能把握好,而且每次都将前边的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(); }}
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(); }}
解决方案 »
免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货