Swift orserialport.send不';我什么也不寄
我是新来的(非常新!!)swift和traggle让我的UI通过串口发送字符串。我已经设法打开端口并读取/解析传入的通信量,但在发送字符串时,什么也不发送 我需要做的是在Swift orserialport.send不';我什么也不寄,swift,string,macos,serial-port,orsserialport,Swift,String,Macos,Serial Port,Orsserialport,我是新来的(非常新!!)swift和traggle让我的UI通过串口发送字符串。我已经设法打开端口并读取/解析传入的通信量,但在发送字符串时,什么也不发送 我需要做的是在sendtext字段中键入,然后按下send按钮将字符串发送到串行端口。此外,当我打印要通过串行端口发送的数据时,它会打印我尝试发送的字节数(即5个字节)。这不应该是我试图发送到串行端口的字符串“Hello”吗 我使用的是Xcode版本11.2(11B52)和Swift 5 任何帮助都将不胜感激。提前谢谢你 以下是我如何调用“发
sendtext字段中键入
,然后按下send按钮
将字符串发送到串行端口。此外,当我打印要通过串行端口发送的数据时,它会打印我尝试发送的字节数(即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) }
}
导入或串行
导入IOKit
导入IOKit.serial
让SFSerialRegexp=
(?[A-Z]+),\\s*“+”(?[0-1]),\\s*
类SFSerialIn:NSObject,ORSSerialPortDelegate{
let path=“/dev/cu.usbserial-AI0484S9”
让波特率:NSNumber=115200
var serialPort:orserialport?
变量委托:SFSerialDelegate?
var stringBuffer=“”
var regex:NSRegularExpression!
var receivedBufferStart=false
重写init(){
regex=try!NSRegularExpression(模式:SFSerialRegexp)
}
脱硝{
断开连接()
}
func SendSerialData(xdata:String){
让数据=数据(TxData.utf8)
串行端口?.send(数据)
打印(TxData)
打印(数据)
}
func connect(){
如果let serialPort=orserialport(路径:path){
serialPort.baudRate=波特率
serialPort.delegate=self
serialPort.open()
}否则{
打印(“无法打开串行端口”)
}
}
func disconnect(){
serialPort?.close()
打印(“关闭端口…”)
}
func serialPort(serialPort:orserialport,didReceive data:data){
guard let string=string(数据:数据,编码:.utf8)
否则{
返回
}
stringBuffer+=字符串
parseBuffer()
}
func parseBuffer(){
让line=stringBuffer.split{$0.isNewline}
警戒线。计数>1其他{
返回
}
设nextLines=lines[1…]
如果!已收到BufferStart{
stringBuffer=nextline
receivedBufferStart=true
返回
}
let line=String(第[0]行)
如果让matchResult=regex.firstMatch(in:line,range:NSRange(..),我觉得您从来没有在serialPort
实例属性中存储打开的串行端口。因此,在执行serialPort?.send(data)
时,serialPort
为零,?
(可选链接)操作符意味着send()
未被调用
打开串行端口后,尝试将其存储在您的属性中:
func connect(){
如果let serialPort=orserialport(路径:path){
serialPort.baudRate=波特率
serialPort.delegate=self
serialPort.open()
self.serialPort=serialPort
}否则{
打印(“无法打开串行端口”)
}
}
有人能帮我吗?