【发布时间】:2017-03-30 16:02:55
【问题描述】:
我有一个非常特殊的问题。在 android 中,我使用 FileInputStream 从串行(ttySx/COM)端口读取。我正在使用它来决定连接了哪些已知设备(如果有的话)。我基本上做的是:
- 您是设备 1 吗?不...
- 您是设备 2 吗?不...
- 你是设备 3 吗?是的...
- 太好了,让我们做一些事情......
这很好用。如果有任何传入数据要读取(来自设备的响应),一切都很好。但是,如果没有连接到 ttySx 的设备,则无法响应我的写入。这意味着没有什么可阅读的。
现在,FileInputStream.read() 是一个阻塞调用。当我在线程中调用它时,线程被有效地冻结。我不能打断线程,因为为此我必须先阅读一些内容。到目前为止,一切都很合理。
由于端口在很长一段时间内没有响应,我决定没有任何连接并想停止读取并处理线程(实际上我不想再打扰端口了,因为没有任何连接,它此刻对我没用)。如前所述,中断本身是没有好处的。应该起作用的是close() FileInputStream(read() 会抛出异常,万岁!)。 close() 工作...只要 read() 读过任何东西(比如当我连接了一个应答设备,然后断开它 -> read() 卡住了 - 因为没有数据要读取 - 但 close() 有效)。
但是,如果在 read() 启动时没有任何东西连接到端口(等于:我没有读取单个字节),close() 方法什么都不做。它不会关闭流。 FileInputStream 通道的关闭也不起作用。
我可以创建一个解决方法:将 FileInputStream 存储在某处,稍后当我想再次从端口读取时,使用相同的实例。那对我有用。不幸的是,我会不必要地阻塞端口本身。没有其他进程(例如另一个应用程序)可以从端口读取,因为它卡在“不可中断”读取中......
任何想法为什么会发生这种情况以及如何使它正确?或者其他方法来检测是否有任何东西连接到 ttySx 端口?
谢谢。
EDIT1:用于与串口通信的库是https://github.com/cepr/android-serialport-api
【问题讨论】:
-
你试过
InputStream::available()方法对你有什么好处吗?我不确定它是否适用于您的情况,但也许值得一试。另外,真的没有办法打断read()的通话吗?如果您尝试使用Future或类似的内容(这将是我的第一直觉)包装怎么办? -
另一个问题:你有没有尝试过同样的情况而不使用 FileInputStream?中断要求是
java.nio中的一个东西,也许从 FileChannel 读取会更好地解决这个问题? -
@M.Prokhorov:谢谢。是的,我确实尝试过
InputStream::available()。它每次都返回 0。即使有什么要读的。因此完全不可靠。至于 FileChannel -> 有趣的想法。我会试试看。 -
您为什么不使用为您处理串行端口通信的库?虽然您在技术上可以使用
FileInputStream,但还有其他设置需要注意(波特率、停止位等) -
@rm5248:实际上,据我所知,使用了一些第三方库(我不是实施它的人,也无法查看源代码几天了,因此我不知道它到底是哪个库)。这个 FileInputStream 是那个库的“幕后”行为。您对 android 上的 rs232 通信有任何经验并建议一个特定的库吗?我将不胜感激,并很乐意将其换成旧的:-)。
标签: java android serial-port fileinputstream