首页 > 解决方案 > 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)")
        }
    }

标签: macosorsserialport

解决方案


我认为主要问题是您没有将实例存储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 中的函数(和方法)名称应始终以小写字母开头。

推荐阅读