简单的Mac 串口助手APP

441 阅读3分钟

使用Swift 写一个Mac的桌面端串口助手。

使用SwiftUI来开发一个串口助手应用程序的界面,创建一个SwiftUI视图并使用组合视图来实现与Storyboard类似的布局。使用ORSSerialPort库来管理串口通信。

步骤

以下是使用SwiftUI开发串口助手应用程序的步骤:

  1. 创建一个新的macOS项目

    • 打开Xcode,选择“Create a new Xcode project”。
    • 选择“App”模板并点击“Next”。
    • 填写项目名称和其他信息,然后点击“Next”。
    • 选择保存项目的位置,然后点击“Create”。
  2. 添加ORSSerialPort库

    • 你可以使用Swift Package Manager来添加ORSSerialPort库。打开你的项目,选择项目文件,然后选择项目的包依赖项(Package Dependencies)。
    • 点击“+”按钮,添加依赖项。输入https://github.com/armadsen/ORSSerialPort,然后点击“Next”,选择最新版本并点击“Finish”。
  3. 创建SwiftUI视图

    • 打开ContentView.swift文件,并修改代码来创建用户界面。以下是一个基本的示例:

代码

//  ContentView.swift

import SwiftUI
import ORSSerial

struct ContentView: View {
    @StateObject private var viewModel = SerialPortViewModel()

    var body: some View {
        VStack(alignment: .leading, spacing: 20) {
            HStack {
                Text("Serial Port:")
                Picker("Serial Port", selection: $viewModel.selectedPort) {
                    ForEach(viewModel.availablePorts, id: \.self) { port in
                        Text(port.path)
                    }
                }
                .onChange(of: viewModel.selectedPort) { _ in
                    viewModel.connectToSelectedPort()
                }
                .frame(width: 200)
            }
            
            Text("Received Data:")
            TextEditor(text: $viewModel.receivedData)
                .frame(height: 200)
                .border(Color.gray, width: 1)
            
            HStack {
                Text("Send Data:")
                TextField("Enter data to send", text: $viewModel.sendData)
                Button("Send") {
                    viewModel.sendDataToPort()
                }
            }
        }
        .padding()
        .frame(minWidth: 400, minHeight: 400)
    }
}

class SerialPortViewModel: NSObject, ObservableObject, ORSSerialPortDelegate {
    @Published var availablePorts: [ORSSerialPort] = ORSSerialPortManager.shared().availablePorts
    @Published var selectedPort: ORSSerialPort? {
        didSet {
            if let port = selectedPort {
                port.delegate = self
                port.baudRate = 9600
                port.open()
            }
        }
    }
    @Published var receivedData = ""
    @Published var sendData = ""

    func connectToSelectedPort() {
        if let port = selectedPort {
            port.close()
            port.delegate = self
            port.open()
        }
    }

    func sendDataToPort() {
        if let data = sendData.data(using: .utf8) {
            selectedPort?.send(data)
        }
    }

    // MARK: - ORSSerialPortDelegate Methods
    func serialPortWasRemovedFromSystem(_ serialPort: ORSSerialPort) {
        print("Serial port \(serialPort.path) was removed from the system")
        DispatchQueue.main.async {
            self.selectedPort = nil
            self.receivedData = "Serial port was removed from the system."
        }
    }
    
    func serialPortWasOpened(_ serialPort: ORSSerialPort) {
        print("Serial port \(serialPort.path) was opened")
    }

    func serialPortWasClosed(_ serialPort: ORSSerialPort) {
        print("Serial port \(serialPort.path) was closed")
    }

    func serialPort(_ serialPort: ORSSerialPort, didReceive data: Data) {
        if let string = String(data: data, encoding: .utf8) {
            DispatchQueue.main.async {
                self.receivedData += string
            }
        }
    }

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

演示

serialAssistant.png

详细说明

  1. 创建SwiftUI视图

    • 使用VStackHStack布局视图。
    • Picker组件用于选择串口。
    • TextEditor组件用于显示接收到的数据。
    • TextFieldButton用于输入和发送数据。
  2. 创建ViewModel

    • 使用ObservableObject来管理串口连接和数据。
    • 通过@Published属性来绑定数据与视图。
    • 实现ORSSerialPortDelegate协议来处理串口事件。
  3. 主应用入口

    • 使用@main标注应用的主入口,创建一个App结构体来启动应用。

通过以上步骤,就可以使用SwiftUI创建一个基本的串口助手应用程序。 这个示例展示了如何使用SwiftUI的声明式语法来构建用户界面,并通过ViewModel管理串口通信。

问题

在使用Swift Package Manager(SPM)添加依赖项时,确实可能会遇到一些问题。ORSSerialPort并非一个标准的Swift Package,因此我们可能需要手动将其集成到项目中。以下是手动集成ORSSerialPort库的步骤:

  1. 克隆ORSSerialPort库

    • 打开终端,执行以下命令来克隆ORSSerialPort库到本地:

      git clone https://github.com/armadsen/ORSSerialPort.git
      
  2. 将ORSSerialPort库添加到Xcode项目中

    • 打开Xcode项目。
    • 在项目导航器中,右键点击项目名称,然后选择“Add Files to 'YourProjectName'...”
    • 在文件选择对话框中,找到刚才克隆的ORSSerialPort库,选择其源文件目录(通常是ORSSerialPort目录),然后点击“Add”。
  3. 设置项目的编译选项

    • 选择项目文件,进入项目设置。
    • 在“Build Phases”选项卡中,展开“Link Binary With Libraries”。
    • 点击“+”按钮,添加IOKit.frameworkCoreFoundation.framework