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)")
}
}
解决方案
我认为主要问题是您没有将实例存储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 中的函数(和方法)名称应始终以小写字母开头。
推荐阅读
- ansible - 无法根据另一个变量在字典的ansible中提取嵌套变量
- r - stat_summary() 和 fun.data = mean_sdl 不工作
- python - 意外的缩进(Discord.py)
- reactjs - document.location 在 ReactJS 生产构建中不起作用
- javascript - MTurk how to upload file to S3 when task is submitted
- javascript - JavaScript:按数组索引对象?
- apache-spark - Spark 中少数任务中的重新分区数据瓶颈
- python - 类型错误:不支持 ufunc 'isnan' - python、numpy、pandas、folium
- java - 处理嵌入对象的 API GET/POST/PUT/DELETE 的更好方法
- python - 如何在这种特殊情况下自动生成日期?