ORSSerialPort不发送数据

时间:2019-05-23 12:43:45

标签: macos 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)")
        }
    }

2 个答案:

答案 0 :(得分:0)

我认为主要的问题是您没有将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")
}

除此问题外,您还应解决此代码的许多问题。最突出的是:

  • 请勿在{{1​​}}中呼叫RunLoop.current.run()。您很少需要手动运行运行循环,并且绝对不需要。
  • 作为documented的ORSSerialPort,您必须在实现applicationDidFinishLaunching(_:)时释放对端口的所有强引用。这意味着在该方法中,您需要执行serialPortWasRemovedFromSystem(_:)
  • 通过这段代码散布的强制解开运算符(port = nil)让我想知道您是否使用了旧版本的ORSSerialPort,直到我添加可空性注释之前。请确保您使用的是最新版本(在撰写本文时为2.0.2)。
  • 为变量使用更多描述性名称。例如,!不是一个好名字,因为它很难理解(“ Ev”是什么意思?),并且它的类型是不是一个字符串,它是一个{{ 1}}个对象(即portEvString
  • 您的ORSSerialPort方法不应以大写字母开头。 Swift中的函数(和方法)名称应始终以小写字母开头。

答案 1 :(得分:0)

禁用SandBox后,一切正常。