ORSSerialPort не отправляет данные - PullRequest
0 голосов
/ 23 мая 2019

Я младший пользователь 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)")
        }
    }

Ответы [ 2 ]

0 голосов
/ 19 июня 2019

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

0 голосов
/ 25 мая 2019

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