我是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)")
}
}
答案 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")
}
除此问题外,您还应解决此代码的许多问题。最突出的是:
RunLoop.current.run()
。您很少需要手动运行运行循环,并且绝对不需要。applicationDidFinishLaunching(_:)
时释放对端口的所有强引用。这意味着在该方法中,您需要执行serialPortWasRemovedFromSystem(_:)
。port = nil
)让我想知道您是否使用了旧版本的ORSSerialPort,直到我添加可空性注释之前。请确保您使用的是最新版本(在撰写本文时为2.0.2)。!
不是一个好名字,因为它很难理解(“ Ev”是什么意思?),并且它的类型是不是一个字符串,它是一个{{ 1}}个对象(即portEvString
。ORSSerialPort
方法不应以大写字母开头。 Swift中的函数(和方法)名称应始终以小写字母开头。答案 1 :(得分:0)
禁用SandBox后,一切正常。