解除阻塞getInputStream.read(bytes [])

时间:2015-03-17 11:47:44

标签: java raspberry-pi inputstream serial-communication

我有一个使用Java ME8在Raspberry Pi(RPi)板上运行的java代码,RPi上的代码使用串行通信与设备通信。数据以帧的形式交换。

从设备接收数据到Rpi时,getInputStream.read(byte []字节)阻塞并且代码被挂起。我无法在while循环中实现超时,例如,如果我没有rcecive任何超过40秒的东西都应该终止。

我的代码是:

private void  receivePacket(long timeOut) throws IOException
{
    //timeOut = 120;
    Arrays.fill( awkByte, (byte)0x00 );
    Arrays.fill( rec, (byte)0x00 );
    System.out.println("Receiving");
    i = 0;
    k = 0;

    // initalizes a byte array to receive data

    //awkByte[0] = (byte) 0xFF;


    int num = 0;
    long x = 0;
    x = System.currentTimeMillis();
    while(System.currentTimeMillis()<=(x+timeOut) )
    {

        Arrays.fill( awkByte, (byte)0x00 );

        num = 0;
        System.out.println("in while");
        k = 0;
        num = connection.getInputStream().read(awkByte);
        if(num <= 0)
        {
            break;
        }

        System.out.println("num : " + num);
        while(num>0)
        {
            rec[i] = awkByte[k];
            i++;
            k++;
            num--;
        } 

    }

    System.out.println("received : ");

    for(int j = 0 ; j < rec.length ; j++)
    {
        System.out.print(rec[j] + "\t");
    }

}

仅供参考:我的代码中没有使用任何多线程。

我获得的字节数少于预期,循环在read()处终止或阻塞。

1 个答案:

答案 0 :(得分:0)

先检查然后阅读。

if (connection.getInputStream().available() > 0) {
    num = connection.getInputStream().read(awkByte);
} else { 
    // do something?
}