ORSSerialPort

ORSSerialPort 是一个易于使用的 macOS 平台 Objective-C 串口库。对于使用 Objective-C 或 Swift 编写 Mac 应用程序,并通过串口(通常是 RS-232)与外部设备通信的程序员来说,它非常有用。您可以使用 ORSSerialPort 来编写连接到 Arduino 项目、机器人、数据采集设备、业余无线电以及各种其他设备的应用程序。使用 ORSSerialPort 打开端口并发送数据可以像这样简单:

let serialPort = ORSSerialPort(path: "/dev/cu.KeySerial1")
serialPort.baudRate = 4800
serialPort.open()
serialPort.send(someData) // someData is an NSData object
serialPort.close() // Later, when you're done with the port

或者,在 Objective-C 中:

ORSSerialPort *serialPort = [ORSSerialPort serialPortWithPath:@"/dev/cu.KeySerial1"];
serialPort.baudRate = @4800;
[serialPort open];
[serialPort sendData:someData]; // someData is an NSData object
[serialPort close]; // Later, when you're done with the port

ORSSerialPort 在 MIT 许可下发布,这意味着您可以自由地在闭源和开源项目中使用它。但是,即使在闭源项目中,您也必须包含一份公开可访问的 ORSSerialPort 版权声明副本,您可以在 LICENSE 文件中找到它。

如果您对 ORSSerialPort 有任何疑问、建议或贡献,请联系我。我也很乐意听到您在哪些酷项目中使用它。

此自述文件提供了 ORSSerialPort 库的概述,旨在提供足够的信息,以便您能够快速上手。您可以在 http://cocoadocs.org/docsets/ORSSerialPort/ 上阅读 ORSSerialPort 的完整技术文档。ORSSerialPort wiki 也包含详细的文档。

此自述文件中的大多数示例代码都是 Swift 编写的。但是,ORSSerialPort 也可以轻松地从 Objective-C 代码中使用。“Examples”文件夹包含所有四个示例项目的 Swift 和 Objective-C 版本。请参阅下面的“示例项目”部分了解更多信息。

如何使用 ORSSerialPort

有很多方法可以将 ORSSerialPort 添加到您的项目中。您可以使用包含的 framework 项目、CarthageCocoaPodsSwift Package Manager。有关每种方法的详细说明,请参阅安装 ORSSerialPort 指南

打开端口并设置它

您可以通过两种方式获取 ORSSerialPort 实例。最简单的方法是使用 ORSSerialPortManageravailablePorts 属性(如下所述)。另一种方法是使用串口的 BSD 设备路径获取一个新的 ORSSerialPort 实例:

let port = ORSSerialPort(path: "/dev/cu.KeySerial1")

请注意,您必须为 ORSSerialPort.init(path:) 提供设备的完整路径,如上面的示例所示。

获得端口实例后,您可以使用 open() 方法打开它。完成端口的使用后,使用 close() 方法关闭它。

可以使用 ORSSerialPort 提供的各种属性来设置端口设置,例如波特率、停止位数、奇偶校验和流控制设置:

port.baudRate = 9600
port.parity = .none
port.numberOfStopBits = 1
port.usesRTSCTSFlowControl = true

有关更多信息,请参阅入门指南

发送数据

通过将 Data 对象传递给 send(_:) 方法来发送原始数据:

let dataToSend = "Hello".data(using: .utf8)
port.send(dataToSend)

接收数据

要接收数据,您可以实现 ORSSerialPortDelegate 协议的 serialPort(_:, didReceive:) 方法,并设置 ORSSerialPort 实例的 delegate 属性。如下所述,此方法始终在主队列上调用。下面包含一个示例实现:

func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
    let string = String(data: data, encoding: .utf8)
    print("Got \(string) from the serial port!")
}

ORSSerialPortDelegate

ORSSerialPort 包含一个 delegate 属性和一个名为 ORSSerialPortDelegate 的 delegate 协议。端口会将其 delegate 通知事件,包括接收数据、端口打开/关闭事件、从系统中移除以及错误。有关更多信息,请参阅入门指南,或阅读 ORSSerialPort.h 中的文档。

ORSSerialPortManager

ORSSerialPortManager 是一个单例类(每个应用程序一个实例),可用于获取可用串口的列表。使用 manager 的 availablePorts 属性来获取端口列表:

let ports = ORSSerialPortManager.shared().availablePorts

可以使用 Key Value Observing 观察 ORSSerialPortManager 的 availablePorts,以便在插入或移除 USB 转串口适配器时收到通知。此外,它会在发生这些事件时发布 NSNotifications。当 Mac 进入睡眠状态时,它还会处理关闭打开的串口,并在唤醒时自动重新打开它们。这可以防止我看到的串口驱动程序在将机器置于睡眠状态时保持端口打开可能导致挂起的问题。请注意,使用 ORSSerialPortManager 是可选的。它提供了一些不错的功能,但只有 ORSSerialPort 是简单地发送和接收数据所必需的。

有关 ORSSerialPortManager 的更多信息,请参阅入门指南,或阅读 ORSSerialPortManager.h 中的文档。

ORSSerialPacketDescriptor

传入的串口数据会在收到后立即传递到您的应用程序。像 ORSSerialPort 这样的底层库无法了解您发送和接收的数据的结构和格式。例如,您可能期望一个完整的数据包,但收到每个字节的回调。通常,这需要您维护一个缓冲区,您用传入的数据填充该缓冲区,仅在收到完整的数据包时才对其进行处理。为了消除手动管理和缓冲传入数据的需要,ORSSerialPort 包含一个数据包解析 API。这是由 ORSSerialPacketDescriptorORSSerialPort 上的相关方法实现的。

有关 ORSSerialPort 的数据包解析 API 的更多信息,请参阅数据包解析 API 指南,阅读 ORSSerialPacketDescriptor.h 中的文档,并参阅 PacketParsingDemo 示例应用程序。

ORSSerialRequest

通常,应用程序会希望向设备发送命令,然后等待收到特定的响应后再继续。为了简化实现这种场景,ORSSerialPort 包含一个请求/响应 API。这是由 ORSSerialRequestORSSerialPort 上的相关方法实现的。

例如,从连接的设备读取温度的程序可能会执行以下操作:

func readTemperature() {
    let command = "$TEMP?;".data(using: String.Encoding.ascii)!
    let responseDescriptor = ORSSerialPacketDescriptor(prefixString: "!TEMP", suffixString: ";", maximumPacketLength: 10, userInfo: nil)
    let request = ORSSerialRequest(dataToSend: command,
        userInfo: SerialBoardRequestType.readTemperature.rawValue,
        timeoutInterval: 0.5,
        responseDescriptor: responseDescriptor)
    serialPort?.send(request)
}

func serialPort(_ serialPort: ORSSerialPort, didReceiveResponse responseData: Data, to request: ORSSerialRequest) {
    temperature = temperatureFromResponsePacket(responseData)!
}

func serialPort(_ serialPort: ORSSerialPort, requestDidTimeout request: ORSSerialRequest) {
    print("Command timed out!")
}

有关 ORSSerialPort 的请求/响应 API 的更多信息,请参阅请求/响应 API 指南,阅读 ORSSerialRequest.h 中的文档,并参阅 RequestResponseDemo 示例应用程序。

示例项目

ORSSerialPort 附带一个名为 Examples 的文件夹,其中包含用于演示 ORSSerialPort 用途的小程序的 Xcode 项目。每个示例都提供 Objective-C 和 Swift 两种版本。包括以下示例应用程序:

您可以在 ORSSerialPort wiki 上阅读有关这些示例的更多信息。

贡献

非常欢迎对 ORSSerialPort 做出贡献。但是,鼓励贡献者在开始处理任何贡献之前阅读贡献指南。如有关于特定贡献的问题,也请随时提出 GitHub 问题或发送电子邮件

GitHub License Badge Build Status Badge CocoaPods Badge