问题描述
1.运行环境Linux服务器,开发语言:java,串口jar包:RXTXcomm.jar2.问题描述:基于RXTXcomm.jar开发串口交互能打开串口“/dev/ttyS0”,建一线程通out.write()给到串口发送数据。代码如下:SerialPortserialPort=(SerialPort)commPort;serialPort.setSerialPortParams(19200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);(备注:linux服务器上通过命令cat/proc/tty/driver/serial命令查到的比特率如下图,带有个大写A。访处我就用了个默认比特率19200)serialPort.setInputBufferSize(40);InputStreamin=serialPort.getInputStream();OutputStreamout=serialPort.getOutputStream();newThread(newSerialWriter(out,data)).start();到接数据用着一个监听来接收数据:代码如下:SerialReaders=newSerialReader(in);serialPort.addEventListener(s);//给当前串口天加一个监听器serialPort.notifyOnDataAvailable(true);//当有数据时通知接收数据类是实现SerialPortEventListener这个监听类的serialEvent(SerialPortEventevent)这个方法:代码如下:publicstaticclassSerialReaderimplementsSerialPortEventListener{publicvoidserialEvent(SerialPortEventevent){intdata;switch(event.getEventType()){caseSerialPortEvent.BI://BI-通讯中断.caseSerialPortEvent.OE://OE-溢位错误.caseSerialPortEvent.FE://FE-帧错误.caseSerialPortEvent.PE://PE-奇偶校验错.caseSerialPortEvent.CD://CD-载波检测.caseSerialPortEvent.CTS://CTS-清除发送.caseSerialPortEvent.DSR://DSR-数据设备准备好.caseSerialPortEvent.RI://RI-振铃指示.caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:log.error("输出缓冲区已经清空");breakcaseSerialPortEvent.DATA_AVAILABLE://DATA_AVAILABLE-有数据到达try{intlen=0;while((data=in.read())>-1){if(data=='n'){break;}value[len++]=data;log.error("--------"+data);//buffer[len++]=(byte)data;bi.add(data);}log.error("returndatalength:"+bi.size());StringrValue="";//输出内容for(intd:bi){rValue+=d+",";}log.error("posreturndata:"+rValue);if(bi.size()==1){intrvalue=bi.get(0);//log.debug("--"+rvalue);if(rvalue==6){isSend=true;}bi=newArrayList<Integer>();}if(bi.size()==13){intrvalue=bi.get(11);log.debug("--"+rvalue);if(rvalue==3){isReturn=true;instance.setValue(value);}}}catch(Exceptione){log.error("接收数据异常:--",e);}break;}}但这段代码运行时没有任何反应,也没有监听到任何数据的返回。求各大个大神能指点一二,具体问题出在哪块?下面贴出整个带码如下:publicclassAuthUtils{privatestaticLoggerlog=Logger.getLogger(AuthUtils.class);privatestaticAuthUtilsinstance=null;privateint[]value=null;privatestaticlongPOSSendTime=20000;privatestaticlongPOSReadTime=60000;privatestaticbooleanisSend=false;privatestaticbooleanisReturn=false;publicAuthUtils(){super();}publicstaticsynchronizedAuthUtilsgetInstance(){if(instance==null)instance=newAuthUtils();returninstance;}//打开串口publicsynchronizedvoidconnect(int[]data)throwsException{Stringsd="";for(intd:data){sd+=d+",";}log.error("initconnect-----senddata:"+sd);Stringpor1="/dev/ttyS0";Stringpor2="/dev/ttyS1";Stringpsm="60000";Stringptm="60000";if(psm!=null&&!"".equals(psm)){POSSendTime=Long.valueOf(psm);}if(ptm!=null&&!"".equals(ptm)){POSReadTime=Long.valueOf(ptm);}isSend=false;isReturn=false;StringportName=por1;CommPortIdentifierportIdentifier=null;try{portIdentifier=CommPortIdentifier.getPortIdentifier(portName);}catch(Exceptione){log.error("portIdentifier打开com1端口"+portName+"错误",e);try{portName=por2;portIdentifier=CommPortIdentifier.getPortIdentifier(portName);}catch(Exceptione1){log.error("portIdentifier打开com2端口"+portName+"错误",e1);}}if(portIdentifier.isCurrentlyOwned()){thrownewException("端口正在被使用");}else{CommPortcommPort=portIdentifier.open(this.getClass().getName(),2000);log.error("com口:"+this.getClass().getName()+"打开成功=======");if(commPortinstanceofSerialPort){SerialPortserialPort=(SerialPort)commPort;serialPort.setSerialPortParams(19200,SerialPort.DATABITS_8,SerialPort.STOPBITS_1,SerialPort.PARITY_NONE);serialPort.setInputBufferSize(40);InputStreamin=serialPort.getInputStream();OutputStreamout=serialPort.getOutputStream();try{newThread(newSerialWriter(out,data)).start();log.error("com口发送数据.....");SerialReaders=newSerialReader(in);serialPort.addEventListener(s);//给当前串口天加一个监听器serialPort.notifyOnDataAvailable(true);//当有数据时通知log.error("等待返回数据.............");//开始时间longstartInterval=System.currentTimeMillis();booleanisNottimeOut=true;do{if(isSend){isNottimeOut=false;log.error("possendsuccess--");break;}longendInterval=System.currentTimeMillis();longinterval=endInterval-startInterval;if(interval>=POSSendTime){log.error("Possendtimeout...:"+interval);thrownewException("Possendtimeout......");}}while(isNottimeOut);startInterval=System.currentTimeMillis();isNottimeOut=true;do{if(isReturn){isNottimeOut=false;log.error("posreturnsuccess--");break;}longendInterval=System.currentTimeMillis();longinterval=endInterval-startInterval;if(interval>=POSReadTime){log.error("Posreturntimeout...:"+interval);thrownewException("Posreturntimeout......");}}while(isNottimeOut);log.error("等待时间结束。。。。。。。。");}catch(Exceptione){thrownewException("接收数据异常:"+e.getMessage());}finally{commPort.close();}}else{log.error("Error:Onlyserialportsarehandledbythisexample.");}}}publicint[]getValue(){returnthis.value;}publicvoidsetValue(int[]value){this.value=value;}//得到返回数据publicstaticclassSerialReaderimplementsSerialPortEventListener{privateInputStreamin;//从串口来的输入流privateint[]value=newint[13];List<Integer>bi=newArrayList<Integer>();publicSerialReader(InputStreamin){this.in=in;}@OverridepublicvoidserialEvent(SerialPortEventevent){log.error("SerialReader:serialEvent-------------");intdata;switch(event.getEventType()){caseSerialPortEvent.BI://BI-通讯中断.caseSerialPortEvent.OE://OE-溢位错误.caseSerialPortEvent.FE://FE-帧错误.caseSerialPortEvent.PE://PE-奇偶校验错.caseSerialPortEvent.CD://CD-载波检测.caseSerialPortEvent.CTS://CTS-清除发送.caseSerialPortEvent.DSR://DSR-数据设备准备好.caseSerialPortEvent.RI://RI-振铃指示.caseSerialPortEvent.OUTPUT_BUFFER_EMPTY:log.error("输出缓冲区已经清空");break;caseSerialPortEvent.DATA_AVAILABLE://DATA_AVAILABLE-有数据到达try{intlen=0;while((data=in.read())>-1){if(data=='n'){break;}value[len++]=data;log.error("--------"+data);//buffer[len++]=(byte)data;bi.add(data);}log.error("returndatalength:"+bi.size());StringrValue="";//输出内容//inti=1;for(intd:bi){//log.debug(i+""+d);rValue+=d+",";//i++;}log.error("posreturndata:"+rValue);//possendokif(bi.size()==1){intrvalue=bi.get(0);//log.debug("--"+rvalue);if(rvalue==6){isSend=true;}bi=newArrayList<Integer>();}if(bi.size()==13){intrvalue=bi.get(11);log.debug("--"+rvalue);if(rvalue==3){isReturn=true;instance.setValue(value);}}}catch(Exceptione){log.error("接收数据异常:--",e);}break;}}/***判断是否获取信息结束*@return*/publicbooleanisGetDataOver(longstartInterval){longendInterval=System.currentTimeMillis();if(value!=null&&value[12]==3&&value[13]!=0){//验证内容的LRCint[]returnValue=newint[7];for(inti=0;i<7;i++){returnValue[i]=value[i+4];}intlrc=value[13];returntrue;}else{longinterval=endInterval-startInterval;if(interval>=POSReadTime){log.debug("接收数据超时...:"+interval);returnfalse;}else{//isGetDataOver(startInterval);}}returnfalse;}publicint[]getValue(){returnthis.value;}}//发送数据publicstaticclassSerialWriterimplementsRunnable{OutputStreamout;int[]data=null;publicSerialWriter(OutputStreamout,int[]data){this.out=out;this.data=data;}publicSerialWriter(OutputStreamout){this.out=out;}publicvoidrun(){log.error("SerialWriter开始发送数据...........");try{Stringsd="";for(intd:data){sd+=d+",";this.out.write(d);}log.error("senddata:"+sd);this.out.flush();log.error("SerialWriter结束发送数据...........");}catch(Exceptione){log.error("SerialWriter发送数据异常。。。",e);}}}publicstaticvoidtest(){try{int[]rs={0x06,0x00,0x00,0x00,0x00,0x00};AuthUtilsaUtils=AuthUtils.getInstance();aUtils.connect(rs);int[]value=aUtils.getValue();if(value!=null&&value.length>0){log.error("pos机返回的数据有:");for(inti=0;i<value.length;i++){System.out.print(value[i]+",");}}else{log.error("pos返回的数据为空");}}catch(Exceptione){e.printStackTrace();}}}