我一直想制作一个可通过串行向我的LED控制器发送指令的应用。为此,我需要在发送命令后阅读控制器回传的内容。我在ORSSerialPort
中发现了以下功能:
func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
// Do things
}
但是,是否有类似ORSSerialPort.read()
的东西?
答案 0 :(得分:1)
我认为ORSSerialPort.read()
不是一个好主意。我知道其他一些串行库是以这种方式编写的,但是唯一可行的方法是read()
阻塞(可能会超时),直到端口上有一个字节进入为止。阻塞I / O使得编写出色的响应式应用变得更加困难,我想指导使用ORSSerialPort的开发人员远离这种方法。
相反,您确实应该在serialPort(_:, didReceive:)
委托中实现ORSSerialPort
。当串行端口接收到数据时,该方法将与接收到的数据一起调用,您可以根据需要执行任何操作。
也就是说,如果您的设备使用命令/响应类型协议进行通信(即,每次发送命令,设备都会发送一些响应),则您应该查看ORSSerialPort的请求/响应API。它允许您显式定义对命令的预期响应的格式,并且ORSSerialPort本身将异步处理等待,解析和验证响应。有关ORSSerialPort的这一部分的更多信息,请参见the documentation。该库还包括一个示例项目RequestResponseDemo,该示例演示了如何使用此API。包括Swift和Objective-C版本。
答案 1 :(得分:1)
ORSSerialPort库很受欢迎,而且总体来说不错。但是,我发现它不适用于TTY串行设备。这主要是因为它使用IOKit来发现串行端口-它只会发现物理设备。
在您的情况下,这可能是可以的,但如果您想测试代码但又不想连接到物理设备,则会崩溃。好的代码始终需要测试框架。因此,请查看https://github.com/kpishere/POSIXSerialPort以获取非常简单的串行接口API,这正是您编写和响应传入数据所需要的,并且还可以与物理或虚拟设备一起使用(如Unix最初设想的那样!)。
不过,对于您的问题,您不想直接调用read()。您开始了解是否“这是一个阅读障碍?”然后您开始处理线程。两种建议的API都可以使您与之隔离,并让您根据事件驱动的模型进行思考-这样可以简化代码。