我有一个非常奇怪的问题。在android中我使用FileInputStream从串行(ttySx / COM)端口读取。我正在使用它来决定连接哪些已知设备(如果有的话)。我基本上做的是:
这很有效。如果有任何要传入的数据(来自设备的响应),一切都很好。但是,如果没有设备连接到ttySx,则没有任何内容可以响应我的写入。这意味着无需阅读。
现在, FileInputStream.read()是一个阻塞调用。当我在线程中调用它时,线程被有效冻结。我无法打断线程,因为我必须首先阅读一些内容。到目前为止,一切都很完美。
由于端口没有响应很长一段时间我决定没有任何连接,并且想要停止读取和处理线程(实际上我不想再打扰端口,因为没有任何连接,它这一刻对我没用。)如前所述,中断本身并不好。什么应该工作,是 close() FileInputStream( read()将抛出异常和万岁!)。 close()有效...只要 read()读取任何内容(就像我连接了一个应答设备,然后断开连接 - > read()被卡住 - 因为没有数据要读 - 但 close()有效。
但是如果 read()启动时没有连接到端口的东西(等于:我还没有读取单个字节),关闭()方法什么都不做。它不会关闭流。也无法关闭FileInputStream频道。
我可以创建一个workarround:将FileInputStream存储在某处,当我想稍后再次从该端口读取时,使用相同的实例。这对我有用。不幸的是,我会不必要地阻止端口本身。没有其他进程(例如另一个应用程序)可以从端口读取,因为它卡在"不间断的"读...
为什么会发生这种情况以及如何做到这一点的任何想法?或者用其他方法来检测是否有任何连接到ttySx端口的东西?
感谢。
EDIT1:用于与串行端口通信的库是https://github.com/cepr/android-serialport-api
答案 0 :(得分:0)
最后我们使用了FileInputStream::available()
。
我们第一次尝试它,就像是:
当然,当我们检查 available 时,还没有什么可读的。然后读取调用被阻止并等待输入。当我们再次检查时,没有任何可用,因为 read 已经清除了端口。
因此,来自M. Prokhorov的这个建议Java close FileInputStream before reading anything对我的情况是正确的。
如果有人想知道有问题的行为: 从研究它来看,似乎首先没有为端口/套接字设计读取流。它是为常规文件设计的。您阅读,到达文档末尾并关闭流。异常是针对流的错误顺序使用而设计的(打开它,关闭id然后尝试读取)。 如果进入阻塞模式,它将阻塞,直到它至少读取一个字节。没办法解决它。 关闭初始化"关闭状态"类似于设置线程的中断状态。