ORSSerialPort не отправляет данные
Я младший пользователь Swift, но на этом этапе жизни мне нужно использовать последовательное соединение в моем проекте. когда я ищу доступный порт, я вижу их без проблем, но когда пытаюсь что-то отправить, у меня проблема, почему?
У меня проблема с ORSSerial это мой код:
func applicationDidFinishLaunching(_ aNotification: Notification) {
let portEvString = ORSSerialPortManager.shared().availablePorts
let pathString = portEvString[0].path
let portClass = SerialController(path:pathString)
portClass.open()
portClass.SendString(data: "hello")
// Insert code here to initialize your application
RunLoop.current.run()
}
class SerialController : NSObject, ORSSerialPortDelegate {
var port : ORSSerialPort?
init(path: String){
port = ORSSerialPort(path: path)
port?.close()
}
func open(){
port?.baudRate=9600
port?.delegate=self
port?.open()
}
func close(){
port?.delegate=nil
port?.close()
}
func SendString(data: String){
let dataa = Data(data.utf8)
port?.send(dataa)
}
func serialPortWasOpened(serialPort: ORSSerialPort!) {
print("PORT IS OPEN....")
}
func serialPortWasClosed(serialPort: ORSSerialPort!) {
print("PORT IS CLOSE")
}
func serialPort(serialPort: ORSSerialPort!, didReceiveData data: NSData!) {
print(NSString(data: data as Data, encoding: String.Encoding.utf8.rawValue))
}
func serialPortWasRemovedFromSystem(_ serialPort: ORSSerialPort!) {
print("PORT REMOVED")
}
func serialPort(serialPort: ORSSerialPort!, didEncounterError error: NSError!) {
print("PORT ERR \(error)")
}
}
1 ответ
Я считаю, что основная проблема заключается в том, что вы не храните экземпляр SerialController
в сильной ссылке, поэтому он освобождается сразу после вашего звонка SendString()
в теме. Вам нужно хранить его в свойстве, например, так:
var serialController: SerialController?
func applicationDidFinishLaunching(_ aNotification: Notification) {
let availablePorts = ORSSerialPortManager.shared().availablePorts
let pathString = availablePorts[0].path
serialController = SerialController(path:pathString)
serialController?.open()
serialController?.SendString(data: "hello")
}
Помимо этой проблемы, в этом коде есть ряд вещей, которые вы должны исправить. Вещи, которые выделяются больше всего:
- Не звони
RunLoop.current.run()
вapplicationDidFinishLaunching(_:)
, Вам редко нужно вручную запускать цикл выполнения, и вам определенно не нужно здесь. - Как задокументировано в ORSSerialPort, вы должны освободить любые строгие ссылки на порт в вашей реализации
serialPortWasRemovedFromSystem(_:)
, Это означает, что в этом методе вам нужно сделатьport = nil
, - Сила развернуть операторы (
!
) разбросанный по этому коду заставляет задуматься, используете ли вы старую версию ORSSerialPort, еще до того, как я добавил аннотации обнуляемости. Пожалуйста, убедитесь, что вы используете последнюю версию (2.0.2 на момент написания статьи). - Используйте более описательные имена для ваших переменных. Например,
portEvString
не хорошее имя, потому что его трудно понять (что означает "Ev"?), и его тип не является строкой, это массивORSSerialPort
объекты (т.е.[ORSSerialPort]
, - Ваш
SendString
Метод не должен начинаться с заглавной буквы. Имена функций (и методов) в Swift всегда должны начинаться со строчной буквы.