最近的一个项目中需要将扫码枪读取到的数据取出,但是因为扫码枪是用串口传输数据的,比较少见,所以记录一下,当给自己做一个小结,有需要的同学也能参考一下。
public class receiveData implements SerialPortEventListener{
protected static CommPortIdentifier portid = null; //通讯端口标识符
protected static SerialPort comPort = null; //串行端口
protected int BAUD = 9600; //波特率
protected int DATABITS = SerialPort.DATABITS_8;; //数据位
protected int STOPBITS = SerialPort.STOPBITS_1; //停止位
protected int PARITY = SerialPort.PARITY_NONE; //奇偶检验
private static OutputStream oStream; //输出流
private static InputStream iStream; //输入流
private static String data="";
StringBuilder buf = new StringBuilder(128);
/* public static void main(String[] args) {
receiveData my = new receiveData();
my.setSerialPortNumber();
}*/
/**
* 读取所有串口名字
*/
private void listPortChoices() {
CommPortIdentifier portId;
Enumeration en = CommPortIdentifier.getPortIdentifiers();
while (en.hasMoreElements()) {
portId = (CommPortIdentifier) en.nextElement();
if (portId.getPortType() == CommPortIdentifier.PORT_SERIAL) {
System.out.println(portId.getName());
}
}
}
/**
* 设置串口号
* @param Port
* @return
*/
public void setSerialPortNumber() {
String osName = null;
String osname = System.getProperty("os.name", "").toLowerCase();
if (osname.startsWith("windows")) {
// windows
osName = "COM1";
} else if (osname.startsWith("linux")) {
// linux
osName = "/dev/ttyS1";
}
System.out.println(osName);
try {
portid = CommPortIdentifier.getPortIdentifier(osName);
if(portid.isCurrentlyOwned()){
System.out.println("端口在使用");
}else{
comPort = (SerialPort) portid.open(this.getClass().getName(), 1000);
}
} catch (PortInUseException e) {
System.out.println("端口被占用");
e.printStackTrace();
} catch (NoSuchPortException e) {
System.out.println("端口不存在");
e.printStackTrace();
}
try {
iStream = comPort.getInputStream(); //从COM1获取数据
oStream = comPort.getOutputStream();
} catch (IOException e) {
e.printStackTrace();
}
try {
comPort.addEventListener(this); //给当前串口增加一个监听器
comPort.notifyOnDataAvailable(true); //当有数据是通知
} catch (TooManyListenersException e) {
e.printStackTrace();
}
try {
//设置串口参数依次为(波特率,数据位,停止位,奇偶检验)
comPort.setSerialPortParams(this.BAUD, this.DATABITS, this.STOPBITS, this.PARITY);
} catch (UnsupportedCommOperationException e) {
System.out.println("端口操作命令不支持");
e.printStackTrace();
}
try {
} catch (IOException e) {
e.printStackTrace();
}
}
@Override
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:// 当有可用数据时读取数据,并且给串口返回数据
try {
while(iStream.available() > 0) {
char dd = (char)iStream.read();
data = data+String.valueOf(dd);
System.out.println(data);
}if(iStream.available()<=0){
}
} catch (Exception e) {
}
break;
}
}
}
这里我用的是rxtx的一些功能,需要注意的是需要在电脑上配置一下环境才能正确输出串口数据,不然这段代码会报错。
配置环境也很简单,只需要将 rxtxSerial.dell 和 rxtxParallel.dell 这两个扩展文件拷贝到 C 盘下的 System32文件夹下就可以了
有需要下载rxtx包和配置文件的可以点击rxtx包及扩展文件 下载,这里有32位和64位。