基于RXRXcomm开发串口交互,获取不到返回数据问题 急

问题描述

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();}}}

解决方案

时间: 2024-09-20 00:18:35

基于RXRXcomm开发串口交互,获取不到返回数据问题 急的相关文章

请求参数返回数据成功-android开发,网络中可以请求返回数据

问题描述 android开发,网络中可以请求返回数据 android开发,在一个网络中可以请求参数返回数据成功,在另一个网络下请求不成功!这是什么原因啊? 解决方案 首先分析这两个网络环境的差异,原因肯定就在这个差异当中.然后分析是发送不成功还是服务器没有收到还是服务器的返回没有收到还是返回的数据是有问题,找到问题在哪里. 解决方案二: 这个网络的差异就是进不去的网络被禁用了一些端口,只是有些接口不可访问,有些接口可以访问.

node.js+Ajax实现获取HTTP服务器返回数据_node.js

我们看一个HTML5页面中通过AJAX请求的方式获取HTTP服务器返回数据的代码示例.由于我们把服务器的端口指定为1337,并将从端口为80的网站中运行HTML5页面,因此这是一种跨域操作,需要在HTTP响应头部中添加Access_Control_Allow_Origin字段,并且将参数指定为允许向服务器请求数据额域名+端口号(省略端口号时允许该域名下的任何端口向服务器请求数据), 静态页面:index.html(注:一定要放在服务器环境下,如果是win7系统的话,可以开启IIS服务,并把页面考

基于C++实现kinect+opencv 获取深度及彩色数据_C 语言

开发环境 vs2010+OPENCV2.4.10 首先,下载最新的Kinect 2 SDK  http://www.microsoft.com/en-us/kinectforwindows/develop/downloads-docs.aspx 下载之后不要插入Kinect,最好也不用插入除了键盘鼠标以外的其它USB设备,然后安装SDK,安装完成之后插入Kinect,会有安装新设备的提示.安装完成之后可以去"开始"那里找到两个新安装的软件,一个是可以显示Kinect深度图,另外一个软件

安卓-基于Bmob开发的Android程序,关于建表的问题

问题描述 基于Bmob开发的Android程序,关于建表的问题 手上有一个基于Bmob开发的Android程序,云端没有数据,想自行建表,当建立product表时程序崩溃,以下是javabean: Category表 public class Category extends BmobObject { private static final long serialVersionUID = -6660631624266818846L; private BmobRelation product;

WP7应用开发中交互设计和UI设计的几点建议

文章描述:WP7交互特性浅析及APP设计探究. Windows phone7是无线领域的新生力量,但是迟迟没有进入中国市场.Mango(注意WP7和mango不是一个概念)的发布带来了中文的操作系统,也让人们看到了该系统的无限可能.在此,我结合自己在进行相关应用设计的经验以及自己对WP7系统认识和理解,浅谈一下这一特别系统的交互特性. 本文索引: 涅磐重生的WP7(以及它的历史简介) WP7对比iOS和Android WP7设计风格 WP7内容和结构框架及特有名词解释 WP7交互特质分析 WP7

【Eclipse插件开发】基于WTP开发自定义的JSP编辑器(六)

IStructuredModel(DOM Document)分析视图 前面的几节中,我们都已经完整的介绍过了WTP最核心的几个数据模型:语法Document (IStructuredDocument).语义Document(IDOMDocument.ICSSDocument)和WTP模型 (IStructuredModel).IStructuredModel在某种程度上可以看作是语义Document和语法Document的门 面,三者关系再罗唆一下: 开发]基于WTP开发自定义的JSP编辑器(六

XP下超级终端与嵌入式开发板交互技巧

一.简介 超级终端是Windows操作系统自带的一个通用的串行交互软件,可以通过这个工具对路由器交换机等进行配置.使用调制解调器.一条零调制解调电缆或以太网连接,再调用此程序能够连接到其他计算机.Telnet 站点.公告板系统 (BBS).联机服务和主机.我们可以用它来调试电路是否可行. 嵌入式开发板基本都有串口,可以通过超级终端与嵌入式系统的串口交互,使超级终端成为嵌入式系统的"显示器". 使用:开始→程序→附件→通讯→超级终端(可新建或者使用现有的连接对设备进行配置); 启动命令:

指针-vc基于对话框的串口助手绘制波形图闪烁问题

问题描述 vc基于对话框的串口助手绘制波形图闪烁问题 在ontimer函数中进行了这样的双缓冲处理为什么settimer(1,50,NULL),还闪烁特别厉害呢,需要怎么修改 //双缓冲技术 CWnd *pWnd; CRect rc; CDC *m_pDC; CDC memDC; pWnd=GetDlgItem(IDC_STATIC_GWAVE); //把控件地址赋给窗口类指针 //定义一个控件尺寸结构体 pWnd->GetClientRect(&rc); //获取空间指针赋值给rc CRe

builder-麻烦大家帮我详细解释下下面这段与串口交互的代码,谢谢!

问题描述 麻烦大家帮我详细解释下下面这段与串口交互的代码,谢谢! void __fastcall TfrmPatient::edtDosageDblClick(TObject *Sender) { //read comm data,then set in edtDosage edit //open com port HANDLE hCom = CreateFile(g_ConfigManager.sComPort.c_str(),GENERIC_WRITE,0,NULL,OPEN_EXISTIN