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 ответ

После отключения SandBox все ок.

Я считаю, что основная проблема заключается в том, что вы не храните экземпляр 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 всегда должны начинаться со строчной буквы.
Другие вопросы по тегам