1

/dev/ttyUSB0我正在使用操作系统为我提供的标准文件在 Ubuntu 中读取和写入 USB 串行端口。我在一个扩展 Thread 的类中完成了所有艰苦的工作:

public PacketHandlingThread(String fileName, PacketListener listener)
{
    mListener = listener;

    //the filename points toward a serial port. Something like /dev/ttyUSB0
    try
    {
        mOutputStream = new FileOutputStream(fileName);
        mInputStream = new FileInputStream(fileName);
        System.out.println("Created Serial Listener");
    }
    catch (Exception e)
    {
        e.printStackTrace();
    }
}

运行方法如下所示:

public void run()
{
    while(true)
    {
        int numRead = -1;
        try
        {
            while(mInputStream.available() < 1)
            {
                //spin in circles
                try {
                    Thread.sleep(10);
                }catch (Exception e) {}
            }

            numRead = mInputStream.read(data);
            System.out.println("Num Read: "+numRead);   
        }
        catch (Exception e)
        {
            e.printStackTrace();
            numRead = -1;
        }

        if (numRead == -1)
        {
            mListener.OnConnectionClosed();
            break;
        }
    }
}

此代码按预期工作,但它必须不断地轮询文件以查看它是否有任何新数据。而不是那个while循环,我宁愿有类似的东西:

synchronized(mInputStream)
{
    mInputStream.wait();    
}

但是当我这样做时,它会永远等待,大概是因为底层流从不调用notify()(并且没有任何理由怀疑它会调用,我只是说我希望它调用)。

我的问题是:有没有办法以非轮询方式从串行端口读取?

我真的很讨厌必须使用串行库,因为我的研究似乎表明它们中的每一个都非常糟糕。任何建议表示赞赏!

4

2 回答 2

3

看看Java 简单的串行连接器库。

您需要做的是实现一个 SerialPortEventListener 接口,如上面的链接所示。

我们已经在生产中使用它,通过 USB 适配器读取串行数据,并且显示稳定。

于 2012-10-03T17:58:37.487 回答
0

首先,恕我直言,如果您正在编写任何与较低级别(IE 设备连接、硬件实现等)接口的东西,最好的选择是使用C++(为您使用 GCC),因为 java 在涉及到处理操作系统级别的功能(在大多数情况下,java 在尝试跨平台时无法使用或者没有明确和直接的操作系统功能实现)。

如果您正在调用基础对象(当您从中读取时应该调用它),您可以使用 for 循环来检查 i ,fileName.size()而不是直接测试流。

for(int i = 0; i < filename.size(); i++)
   try{
        //...code here...
      }
       catch(Exception e)
       {
         e.printStackTrace();
       }
}

祝你好运,

于 2012-07-04T00:07:49.607 回答