就我所知现在有两种:一个是while(input.read() != -1);另一个是while(input.available()>0),我现在写一个用电脑的串口进行通信的应用程序,用事件进行接收数据,用第一个好像是会出现在数据错误或丢失,第二个好像没有,到底哪方法比较好呢,第一个出现错误的原因是什么,还有第一个好像是到尾都不会返回-1,这个是不是与串口事件中的方法有关,还是它本来就不会退while循环呢?请高手指教下

解决方案 »

  1.   

    把你的代码贴出来看看吧,特别是input的实现。
      

  2.   

    input是电脑串口中用来接收串口中数据BufferedInputStream 的一个实例
    串口数据是通过事件触发去接收的(当串口中有数据时触发)
    @Override
    public void serialEvent(SerialPortEvent e) {
    // TODO Auto-generated method stub
    switch (e.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:
    readComm4();
    break;
    default:
    break;
    }
    }
    readComm4()为读串口数据的方法
    private void readComm4() {
    BufferedInputStream input = serialBean.getInputStream(); int code; try { byte[] dataBuf = new byte[1041];
    System.out.println("into");
    while ((code = input.read(dataBuf)) != -1) {
    }
    System.out.println("out"); } catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    } }
    现在是进入了readComm4()方法打印了into就是出不去那个while循环打印不了out.
    可以保证输入到串口的数据是少于1041个的.
      

  3.   

    你说用event方法不会丢失数据,那么问题出在read()方法中,你要贴的是read()的实现呀。
      

  4.   

    就是类InputStream中的read()方法啊,上面的readComm4()就是读取串口中数据的方法.现在是进入了while()之后就算到接收到串口上的所有数据(即输入流到达流尾),这时程序也没有退出while()循环. read()方法不是说到达流尾就返回-1么?
      

  5.   

    楼主没有了解具体的协议吧 ?串口通信,也应该遵照某种协议才是。就是通信双方的通信方式和数据格式。楼主这个帖子的标题已经谈到IO流的结束符了,本以为,楼主理解IO结束符呢。
    楼主调用的input.read方法,只有当IO流结束了或者缓冲区(楼主传的那个数组参数)填满了才会返回。
    也就是说,这个方法是阻塞读的。为什么没有进行下一次的while循环 ?
    因为read方法没有返回;为啥没返回,因为,IO根本就没有结束;
    为啥IO没结束,因为,对方根本没有执行close方法。这回,楼主明白了吗 ?另外,available方法是探测当前系统缓冲区中是否存在数据,不能判断是否是IO的结束符。
    之后,楼主就会想到了,楼主要的,其实不是IO的结束符,而是,每次数据交互的结束符。
    具体怎样判断每次交互多少数据,是根据具体协议来判断的。