首页 > 解决方案 > ORSSerialPort.send 不发送任何内容

问题描述

我是新的(非常新的!!)快速和散乱的让我的用户界面通过串行端口发送一个字符串。我已经设法打开端口并读取/解析传入的流量,但是在发送字符串时,什么都没有发送。

我需要做的是输入sendTextField和当按下SendButton将字符串发送到串口。此外,当我打印data我想通过串口发送的内容时,它会打印我尝试发送的字节数(即 5 个字节)。这不应该是我尝试发送到串行端口的字符串“Hello”吗?

我正在使用 Xcode 版本 11.2 (11B52) 和 Swift 5。

任何帮助将不胜感激。先感谢您!

这就是我调用“发送”函数的方式:

   @IBAction func SendButton(_ sender: Any) {
      let TxData = sendTextField.stringValue
      SFSerialIn.SendSerialData(TxData)      
   }

我的主要程序如下:

import ORSSerial
import IOKit
import IOKit.serial


let SFSerialRegexp =
    "(?<SFmode>[A-Z]+),\\s*" + "(?<prox>[0-1]),\\s*"

class SFSerialIn: NSObject, ORSSerialPortDelegate {


    let path = "/dev/cu.usbserial-AI0484S9" 
    let baudRate: NSNumber = 115200

    var serialPort: ORSSerialPort?
    var delegate: SFSerialDelegate?

    var stringBuffer = ""
    var regex: NSRegularExpression!
    var receivedBufferStart = false

    override init() {
        regex = try! NSRegularExpression(pattern: SFSerialRegexp)
    }

    deinit {
        disconnect()
    }

    func SendSerialData(_ TxData: String){
       let data = Data(TxData.utf8)
       serialPort?.send(data)
       print(TxData)
       print(data)
    }  

    func connect() {
        if let serialPort = ORSSerialPort(path: path) {
            serialPort.baudRate = baudRate
            serialPort.delegate = self
            serialPort.open()
        } else {
            print("Failed to open serial port")
        }
    }

    func disconnect() {
        serialPort?.close()
        print("closing port...")
    }


    func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
        guard let string = String(data: data, encoding: .utf8)
            else {
            return
        }

        stringBuffer += string

        parseBuffer()
    }

    func parseBuffer() {
        let lines = stringBuffer.split { $0.isNewline }

        guard lines.count > 1 else {
            return
        }

        let nextLines = lines[1...].joined()

        if !receivedBufferStart {
            stringBuffer = nextLines
            receivedBufferStart = true
            return
        }

        let line = String(lines[0])
        if let matchResult = regex.firstMatch(in: line, range: NSRange(..<line.endIndex, in: line)) {
            let sensorFrame = SFFrame(matchResult: matchResult, string: line)
            delegate?.receive(sensorFrame: sensorFrame)
            stringBuffer = nextLines
            return
        }

        print("Failed to parse line :(")
        stringBuffer = nextLines
    }

    func serialPort(_ serialPort: ORSSerialPort, didEncounterError error: Error) {
        print("Serial port encountered error", error)
    }

    func serialPortWasOpened(_ serialPort: ORSSerialPort) {
        print("Serial port opened")
    }

    func serialPortWasClosed(_ serialPort: ORSSerialPort) {
        print("Serial port closed")
    }

    func serialPortWasRemovedFromSystem(_ serialPort: ORSSerialPort) {
        print("Serial port was removed from system")
    }
  }

protocol SFSerialDelegate {
    func receive(sensorFrame: SFFrame)
}

extension StringProtocol {
    var data: Data { .init(utf8) }
}

标签: swiftstringmacosserial-portorsserialport

解决方案


在我看来,您从未将打开的串行端口存储在您的serialPort实例属性中。因此,当您这样做时serialPort?.send(data), ,serialPort是 nil,并且?(可选链接)运算符表示send()不调用。

打开后尝试将串行端口存储在您的财产中:

func connect() {
    if let serialPort = ORSSerialPort(path: path) {
        serialPort.baudRate = baudRate
        serialPort.delegate = self
        serialPort.open()
        self.serialPort = serialPort
    } else {
        print("Failed to open serial port")
    }
}

推荐阅读