使用Swift 写一个Mac的桌面端串口助手。
使用SwiftUI来开发一个串口助手应用程序的界面,创建一个SwiftUI视图并使用组合视图来实现与Storyboard类似的布局。使用ORSSerialPort库来管理串口通信。
步骤
以下是使用SwiftUI开发串口助手应用程序的步骤:
-
创建一个新的macOS项目:
- 打开Xcode,选择“Create a new Xcode project”。
- 选择“App”模板并点击“Next”。
- 填写项目名称和其他信息,然后点击“Next”。
- 选择保存项目的位置,然后点击“Create”。
-
添加ORSSerialPort库:
- 你可以使用Swift Package Manager来添加ORSSerialPort库。打开你的项目,选择项目文件,然后选择项目的包依赖项(Package Dependencies)。
- 点击“+”按钮,添加依赖项。输入
https://github.com/armadsen/ORSSerialPort,然后点击“Next”,选择最新版本并点击“Finish”。
-
创建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)")
}
}
演示
详细说明
-
创建SwiftUI视图:
- 使用
VStack和HStack布局视图。 Picker组件用于选择串口。TextEditor组件用于显示接收到的数据。TextField和Button用于输入和发送数据。
- 使用
-
创建ViewModel:
- 使用
ObservableObject来管理串口连接和数据。 - 通过
@Published属性来绑定数据与视图。 - 实现
ORSSerialPortDelegate协议来处理串口事件。
- 使用
-
主应用入口:
- 使用
@main标注应用的主入口,创建一个App结构体来启动应用。
- 使用
通过以上步骤,就可以使用SwiftUI创建一个基本的串口助手应用程序。 这个示例展示了如何使用SwiftUI的声明式语法来构建用户界面,并通过ViewModel管理串口通信。
问题
在使用Swift Package Manager(SPM)添加依赖项时,确实可能会遇到一些问题。ORSSerialPort并非一个标准的Swift Package,因此我们可能需要手动将其集成到项目中。以下是手动集成ORSSerialPort库的步骤:
-
克隆ORSSerialPort库:
-
打开终端,执行以下命令来克隆ORSSerialPort库到本地:
git clone https://github.com/armadsen/ORSSerialPort.git
-
-
将ORSSerialPort库添加到Xcode项目中:
- 打开Xcode项目。
- 在项目导航器中,右键点击项目名称,然后选择“Add Files to 'YourProjectName'...”
- 在文件选择对话框中,找到刚才克隆的ORSSerialPort库,选择其源文件目录(通常是
ORSSerialPort目录),然后点击“Add”。
-
设置项目的编译选项:
- 选择项目文件,进入项目设置。
- 在“Build Phases”选项卡中,展开“Link Binary With Libraries”。
- 点击“+”按钮,添加
IOKit.framework和CoreFoundation.framework。