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

标签 java raspberry-pi inputstream serial-communication

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

当从设备接收数据到 Rpi 时,getInputStream.read(byte[] byte) 会阻塞并且代码被挂起。而且我无法在 while 循环中实现超时,例如,如果我在超过 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() 处终止或阻塞。

最佳答案

先检查,再阅读。

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

关于java - 解除阻塞 getInputStream.read(bytes[]),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29098288/

相关文章:

python - 如何解决 "ValueError: The channel sent is invalid on a Raspberry Pi"错误?

java - 具有并发输入/输出流的Java流程

javascript - 如何从 Node.Js 中的字符串创建流?

java - StringBuffer 未正确打印

java - 如果加载超过一定时间则关闭 AsyncTask(android)

java - 使用断言添加前置条件和后置条件

Python 将字符串写入内存并使用其他 Python 程序读取内存

python - 树莓派运行时错误 : Conflicting edge detection already enabled for this GPIO channel

java - 将 org.bouncycaSTLe.jce.PKCS10CertificationRequest 更新为 org.bouncycaSTLe.pkcs.PKCS10CertificationRequest;

java - 未找到 hibernate.properties