ORSSerialPort.send ничего не отправляет - PullRequest
1 голос
/ 12 ноября 2019

Я новичок (очень новый !!), чтобы быстро и изо всех сил заставить свой пользовательский интерфейс отправлять строку через последовательный порт. Мне удалось открыть порт и прочитать / проанализировать входящий трафик, но когда дело доходит до отправки строки, ничего не отправляется.

Что мне нужно сделать, это набрать 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) }
}

1 Ответ

0 голосов
/ 03 декабря 2019

Мне не кажется, что вы когда-либо сохраняли открытый последовательный порт в свойстве экземпляра 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")
    }
}
...