我正在使用操作系统为我提供的标准/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();
}
}
run方法如下所示:
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()
(并且没有任何理由怀疑它会这样,我只是说我希望它能做到)。
我的问题是:有没有办法以非轮询方式从串口读取?
我真的很讨厌必须使用串行库,因为我的研究似乎表明它们中的每一个都非常糟糕。任何建议表示赞赏!
答案 0 :(得分:3)
查看Java simple serial connector库。
您需要做的是实现SerialPortEventListener接口,如上面的链接所示。
我们已经在生产中使用它,通过USB适配器读取串行数据,并且它已经显示为稳定。
答案 1 :(得分:0)
首先,恕我直言,如果您正在编写与较低级别(IE设备连接,硬件实现等)接口的任何内容,最好的选择是使用 C ++ (与GCC一起使用) ),因为java在处理操作系统级别功能方面很苛刻(在大多数情况下,java无法使用或者没有明确和直接的OS功能实现,因为它试图跨平台)。
如果你正在调用基础对象(你应该从中读取它),你可以使用for循环来检查fileName.size()
,而不是直接测试流。
for(int i = 0; i < filename.size(); i++)
try{
//...code here...
}
catch(Exception e)
{
e.printStackTrace();
}
}
祝你好运,