java - 如何在Java中设置从串行端口读取时的超时?

标签 java multithreading serial-port

我是 JAVA 编程新手。我被分配的任务是编写一个 JAVA GUI 应用程序,该应用程序将通过串行端口与外部设备交互。我已经成功地使我的代码在 Mac OS X 和 Win32 平台下使用 jSSC(Java 简单串行连接器)包进行编译和运行。 jSSC 项目提供了不错的示例代码,并且使用 javax.comm 风格的 SerialPortEventListener 接口(interface)相当容易实现。

但很快我就了解到我需要在我的实现中添加“ACK 超时”功能,以防止错误。在 C 语言中,这可以通过 select() API 调用轻松实现,并将第 5 个参数动态设置为所需的持续时间。但在 JAVA 中,我不知道如何做到这一点。

我应该设置另一个时间线程并通过直接调用serialEvent()方法来触发计时器生成的事件吗?但这可能会导致一些赛车状况。

<小时/>

(03/27 10:43 编辑):好的,我已经追踪到了 jSSC 的源代码。看起来jSSC只是在JVM中创建一个新的Runnable线程,当一个Listener注册到它时;该线程将通过 native 函数调用不断轮询状态,这将调用 ioctl() 等系统 api 调用。所以如果不修改原生库就不可能添加超时事件。

我想我必须改变串口事件处理的方式。我需要创建另一个 Runnable 线程来处理传入的数据过程,而不是直接解析来自 jSSC 事件线程的 serialEvent() 方法调用中的数据。我可以设置一个计时器将超时事件扔到该线程中。

在这种情况下,我需要设置一个事件调度线程,就像 SwingUtility.invokelater() 一样。但我不知道是否应该从下往上实现一个,或者我可以只使用 AWT EDT 来处理它。

谁能给我一些建议吗?

最佳答案

我曾使用过java comm,从未使用过jssc。 JavaComm提供了一个开放方法,可以配置超时:

serialPort1 = (SerialPort) portId1.open("ComControl", 2000);

根据 jssc javadoc,open 方法不管理超时机制。

关于java - 如何在Java中设置从串行端口读取时的超时?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9868249/

相关文章:

java - 正则表达式帮助 : Excluding characters

php - Windows 上通过串口使用 ESC/POS 打印

c - 计数器值小于访问次数的网页计数器

c++ - QThread::msleep() 卡住程序

c++ - 嵌入式Linux应用程序中的周期 "lags"

c - 用C从rs232端口读取

c - Memcpy 在 C 低级程序中不起作用

java - 2 类,按降序排列到ArrayList中

java - Java 中的这种弱单例实现是线程安全的(和 GC 安全的)吗?

java - 使用PDFbox确定文档中单词的坐标