Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
62d6742987 | ||
|
|
66c27258da | ||
|
|
10b91eb8a2 | ||
|
|
581ebc7e10 | ||
|
|
db7a3b79a2 | ||
|
|
1b9591e07a | ||
|
|
af1fa134cc | ||
|
|
812a55a381 |
@@ -1,5 +1,5 @@
|
||||
# SwiftSerial
|
||||
A Swift 3 Linux and Mac library for reading and writing to serial ports. This library has been tested to work on macOS Sierra, Linux Mint 18 (based on Ubuntu 16.04) and on the [Raspberry Pi 3 on Ubuntu 16.04](https://wiki.ubuntu.com/ARM/RaspberryPi). Other platforms using Ubuntu like the Beaglebone might work as well.
|
||||
A Swift Linux and Mac library for reading and writing to serial ports. This library has been tested to work on macOS Sierra, Linux Mint 18 (based on Ubuntu 16.04) and on the [Raspberry Pi 3 on Ubuntu 16.04](https://wiki.ubuntu.com/ARM/RaspberryPi). Other platforms using Ubuntu like the Beaglebone might work as well.
|
||||
|
||||
This library is an improvement over my previous now deprecated library [SwiftLinuxSerial](https://github.com/yeokm1/SwiftLinuxSerial) which was less Swifty and supported only Linux. This library is thanks largely to [Jay Jun](https://github.com/jayjun). His original pull request can be found [here](https://github.com/yeokm1/SwiftLinuxSerial/pull/1).
|
||||
|
||||
|
||||
@@ -209,6 +209,8 @@ public enum PortError: Int32, Error {
|
||||
case mustReceiveOrTransmit
|
||||
case mustBeOpen
|
||||
case stringsMustBeUTF8
|
||||
case unableToConvertByteToCharacter
|
||||
case deviceNotConnected
|
||||
}
|
||||
|
||||
public class SerialPort {
|
||||
@@ -267,7 +269,7 @@ public class SerialPort {
|
||||
useHardwareFlowControl: Bool = false,
|
||||
useSoftwareFlowControl: Bool = false,
|
||||
processOutput: Bool = false) {
|
||||
|
||||
|
||||
guard let fileDescriptor = fileDescriptor else {
|
||||
return
|
||||
}
|
||||
@@ -371,6 +373,12 @@ extension SerialPort {
|
||||
throw PortError.mustBeOpen
|
||||
}
|
||||
|
||||
var s: stat = stat()
|
||||
fstat(fileDescriptor, &s)
|
||||
if s.st_nlink != 1 {
|
||||
throw PortError.deviceNotConnected
|
||||
}
|
||||
|
||||
let bytesRead = read(fileDescriptor, buffer, size)
|
||||
return bytesRead
|
||||
}
|
||||
@@ -378,7 +386,7 @@ extension SerialPort {
|
||||
public func readData(ofLength length: Int) throws -> Data {
|
||||
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: length)
|
||||
defer {
|
||||
buffer.deallocate(capacity: length)
|
||||
buffer.deallocate()
|
||||
}
|
||||
|
||||
let bytesRead = try readBytes(into: buffer, size: length)
|
||||
@@ -417,15 +425,18 @@ extension SerialPort {
|
||||
var data = Data()
|
||||
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 1)
|
||||
defer {
|
||||
buffer.deallocate(capacity: 1)
|
||||
buffer.deallocate()
|
||||
}
|
||||
|
||||
while true {
|
||||
let bytesRead = try readBytes(into: buffer, size: 1)
|
||||
|
||||
if bytesRead > 0 {
|
||||
if ( buffer[0] > 127) {
|
||||
throw PortError.unableToConvertByteToCharacter
|
||||
}
|
||||
let character = CChar(buffer[0])
|
||||
|
||||
|
||||
if character == terminator {
|
||||
break
|
||||
} else {
|
||||
@@ -448,14 +459,14 @@ extension SerialPort {
|
||||
|
||||
public func readByte() throws -> UInt8 {
|
||||
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: 1)
|
||||
|
||||
|
||||
defer {
|
||||
buffer.deallocate(capacity: 1)
|
||||
buffer.deallocate()
|
||||
}
|
||||
|
||||
|
||||
while true {
|
||||
let bytesRead = try readBytes(into: buffer, size: 1)
|
||||
|
||||
|
||||
if bytesRead > 0 {
|
||||
return buffer[0]
|
||||
}
|
||||
@@ -463,11 +474,11 @@ extension SerialPort {
|
||||
}
|
||||
|
||||
public func readChar() throws -> UnicodeScalar {
|
||||
let byteRead = readByte()
|
||||
let character = UnicodeScalar(buffer[0])
|
||||
return character
|
||||
let byteRead = try readByte()
|
||||
let character = UnicodeScalar(byteRead)
|
||||
return character
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
// MARK: Transmitting
|
||||
@@ -487,7 +498,7 @@ extension SerialPort {
|
||||
let size = data.count
|
||||
let buffer = UnsafeMutablePointer<UInt8>.allocate(capacity: size)
|
||||
defer {
|
||||
buffer.deallocate(capacity: size)
|
||||
buffer.deallocate()
|
||||
}
|
||||
|
||||
data.copyBytes(to: buffer, count: size)
|
||||
|
||||
Reference in New Issue
Block a user