• Stars
    star
    752
  • Rank 60,353 (Top 2 %)
  • Language
    Objective-C
  • License
    MIT License
  • Created over 12 years ago
  • Updated about 1 year ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Serial port library for Objective-C and Swift macOS apps

ORSSerialPort

ORSSerialPort is an easy-to-use Objective-C serial port library for macOS. It is useful for programmers writing Objective-C or Swift Mac apps that communicate with external devices through a serial port (most commonly RS-232). You can use ORSSerialPort to write apps that connect to Arduino projects, robots, data acquisition devices, ham radios, and all kinds of other devices. Using ORSSerialPort to open a port and send data can be as simple as this:

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

Or, in 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 is released under an MIT license, meaning you're free to use it in both closed and open source projects. However, even in a closed source project, you must include a publicly-accessible copy of ORSSerialPort's copyright notice, which you can find in the LICENSE file.

If you have any questions about, suggestions for, or contributions to ORSSerialPort, please contact me. I'd also love to hear about any cool projects you're using it in.

This readme provides an overview of the ORSSerialPort library and is meant to provide enough information to get up and running quickly. You can read complete technical documentation for ORSSerialPort on http://cocoadocs.org/docsets/ORSSerialPort/. The ORSSerialPort wiki also contains detailed documentation.

Most of the example code in this readme is in Swift. However, ORSSerialPort can also easily be used from Objective-C code. The Examples folder contains Swift and Objective-C versions of all four example projects. See the Example Projects section below for more information.

How to Use ORSSerialPort

There are a number of ways to add ORSSerialPort to your project. You can use the included framework project, Carthage, CocoaPods, or the Swift Package Manager. See the Guide to Installing ORSSerialPort for detailed instructions for each of these methods.

Opening a Port and Setting It Up

You can get an ORSSerialPort instance either of two ways. The easiest is to use ORSSerialPortManager's availablePorts property (explained below). The other way is to get a new ORSSerialPort instance using the serial port's BSD device path:

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

Note that you must give ORSSerialPort.init(path:) the full path to the device, as shown in the example above.

After you've got a port instance, you can open it with the open() method. When you're done using the port, close it using the close() method.

Port settings such as baud rate, number of stop bits, parity, and flow control settings can be set using the various properties ORSSerialPort provides:

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

For more information, see the Getting Started Guide.

Sending Data

Send raw data by passing a Data object to the send(_:) method:

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

Receiving Data

To receive data, you can implement the ORSSerialPortDelegate protocol's serialPort(_:, didReceive:) method, and set the ORSSerialPort instance's delegate property. As noted below, this method is always called on the main queue. An example implementation is included below:

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

ORSSerialPortDelegate

ORSSerialPort includes a delegate property, and a delegate protocol called ORSSerialPortDelegate. A port informs its delegate of events including receipt of data, port open/close events, removal from the system, and errors. For more information, see the Getting Started Guide, or read the documentation in ORSSerialPort.h.

ORSSerialPortManager

ORSSerialPortManager is a singleton class (one instance per application) that can be used to get a list of available serial ports. Use the manager's availablePorts property to get a list of ports:

let ports = ORSSerialPortManager.shared().availablePorts

ORSSerialPortManager's availablePorts can be observed with Key Value Observing to be notified when a USB to serial adapter is plugged in or removed. Additionally, it posts NSNotifications when these events occur. It will also handle closing open serial ports when the Mac goes to sleep, and reopening them automatically on wake. This prevents problems I've seen with serial port drivers that can hang if the port is left open when putting the machine to sleep. Note that using ORSSerialPortManager is optional. It provides some nice functionality, but only ORSSerialPort is necessary to simply send and receive data.

For more information about ORSSerialPortManager, see the Getting Started Guide, or read the documentation in ORSSerialPortManager.h.

ORSSerialPacketDescriptor

Incoming serial data is delivered to your application as it is received. A low level library like ORSSerialPort has no way of knowing anything about the structure and format of the data you're sending and receiving. For example, you may be expecting a complete packet of data, but receive callbacks for each byte. Normally, this requires you to maintain a buffer which you fill up with incoming data, only processing it when a complete packet has been received. In order to eliminate the need for manual management and buffering of incoming data, ORSSerialPort includes a packet parsing API. This is implemented by ORSSerialPacketDescriptor and associated methods on ORSSerialPort.

For more information about ORSSerialPort's packet parsing API, see the Packet Parsing API Guide, read the documentation in ORSSerialPacketDescriptor.h, and see the PacketParsingDemo example app.

ORSSerialRequest

Often, applications will want to send a command to a device, then wait to receive a specific response before continuing. To ease implementing this kind of scenario, ORSSerialPort includes a request/response API. This is implemented by ORSSerialRequest and associated methods on ORSSerialPort.

For example, a program that read the temperature from a connected device might do the following:

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!")
}

For more information about ORSSerialPort's request/response API, see the Request/Response API Guide, read the documentation in ORSSerialRequest.h, and see the RequestResponseDemo example app.

Example Projects

Included with ORSSerialPort is a folder called Examples, containing Xcode projects for small programs demonstrating the use of ORSSerialPort. Each example is available in both Objective-C and Swift. The following example apps are included:

You can read more about these examples on the ORSSerialPort wiki.

Contributing

Contributions to ORSSerialPort are very welcome. However, contributors are encouraged to read the contribution guidelines before starting work on any contributions. Please also feel free to open a GitHub issue or email with questions about specific contributions.

GitHub License Badge Build Status Badge CocoaPods Badge

More Repositories

1

analyze_apps

Script to analyze Swift usage in iOS or Mac apps
Python
37
star
2

Cubes

Super simple SceneKit iOS demo.
Swift
11
star
3

MIDI-File-Writer

Dead simple MIDI file writing example for OS X using MIKMIDI
Objective-C
7
star
4

Presentations

Slides and example code from various presentations I've given
Objective-C
5
star
5

GlassGem

Consistent Overhead Byte Stuffing (COBS) encoding/decoding package for Swift
Swift
4
star
6

help.aetherlog.com

Website for Aether help and documentation
Shell
2
star
7

ArduinoRequestResponse

Arduino firmware companion to ORSSerialPort RequestResponseDemo example application.
C++
2
star
8

DKBLE112Demo

iOS and BGScript projects to demonstrate connecting an iOS device to the Bluegiga DKBLE112 board. Used in my presentation on January 8, 2013 at SLC CocoaHeads.
Objective-C
2
star
9

SceneKitDemo

Demo app for SLC CocoaHeads SceneKit Presentation 05MAR13
C
2
star
10

Rover

Swift
2
star
11

Secrets

Swift
1
star
12

ArduinoPacketSend

Arduino firmware companion to ORSSerialPort PacketParsingDemo example application.
Arduino
1
star
13

MyPackage

Swift
1
star
14

SwiftIOKitBridge

Simple C bridge functions used by Swift version of https://github.com/armadsen/ORSSerialPort/
C
1
star
15

IntroToArduino

Repository for slides and sample code for my Introduction to Arduino presentation at SLC CocoaHeads on February 3, 2015.
Objective-C
1
star
16

SimpleMIDIDemo

Dead simple example of connecting to and receiving data from MIDI devices in a Swift OS X app.
Objective-C
1
star
17

ROT.swift

Simple ROT encoder package
Swift
1
star
18

Oxygen

Simple, unfinished app for reading oxygen saturation from a Nonin 9600
Objective-C
1
star
19

HorizontalZoom

Sample project to go along with http://stackoverflow.com/questions/35234475/how-to-make-uiscrollview-zoom-in-only-one-direction-when-using-auto-layout/
Swift
1
star
20

MIDI-File-Explorer

Utility for showing events in a MIDI file
Objective-C
1
star
21

CocoaHeads-SLC-Presentations

Repository for sample code for presentations I've given at CocoaHeads SLC
Objective-C
1
star
22

Telegraph

Simple Mac app for sending Morse code
Objective-C
1
star
23

CommunicatingBetweenADriverKitExtensionAndAClientApp

C++
1
star
24

Canary

Packet parsing package for Swift
Swift
1
star