2

我一直想制作一个通过串行向我的 LED 控制器发送指令的应用程序。为此,我需要读取控制器在发送命令后发回的内容。我在以下功能中找到了ORSSerialPort

func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
    // Do things
}

但是,有类似的东西ORSSerialPort.read()吗?

4

2 回答 2

2

我不认为ORSSerialPort.read()是个好主意。我知道其他一些串行库是以这种方式编写的,但唯一的工作方式是read()阻塞(可能有超时),直到端口上出现一个字节。阻塞 I/O 使得编写一个好的响应式应用程序变得更加困难,我想指导使用 ORSSerialPort 的开发人员远离这种方法。

相反,您确实应该serialPort(_:, didReceive:)在您的ORSSerialPort委托中实现。当串口接收到数据时,将使用接收到的数据调用该方法,您可以对它做任何您想做的事情。

也就是说,如果您的设备使用命令/响应类型协议进行通信(即,每次发送命令时,设备都会发送一些响应),您应该查看 ORSSerialPort 的请求/响应 API。它允许您明确定义对命令的预期响应的格式,并且 ORSSerialPort 本身将处理异步等待、解析和验证响应。有关这部分 ORSSerialPort 的更多信息,请参阅文档。该库还包括一个示例项目 RequestResponseDemo,用于演示如何使用此 API。包括 Swift 和 Objective-C 版本。

于 2018-09-05T15:56:11.673 回答
1

ORSSerialPort 库很受欢迎并且总体上很好。但是,我发现它不适用于 TTY 串行设备。这主要是因为它使用 IOKit 来发现串行端口——它只会发现物理设备。

在您的情况下这可能没问题,但是在您想要测试代码但又不想连接到物理设备的情况下,它会失败。好的代码总是需要一个测试框架。因此,请查看https://github.com/kpishere/POSIXSerialPort以获得一个非常简单的串行接口 API,它正是您编写和响应传入数据所需的,并且也适用于物理或虚拟设备(正如 Unix 最初设想的那样! )。

不过,对于您的问题,您不想直接调用 read() 。您会了解“是否是阻塞读取”?然后你开始处理线程。这两个建议的 API 都将您与此隔离开来,并允许您根据事件驱动模型进行思考——这使得代码更加简单。

于 2020-07-21T12:49:42.403 回答