MAC桌面程序开发之 USB串口调试助手开发

本次主要讲解,如何在Mac电脑上开发,如今流行的电脑桌面程序,因为我们在做互联网/智能化设备的时候,无疑或许会用到MAC来进行调试;

重点如下:

  1. 如何在MAC电脑上创建桌面程序;
  2. 在项目中添加usb协议库。如:HID,ORSSerialPort;
  3. 项目内容主要分为:串口名,波特率,开/关串口,发送数据,接收设备数据,上传文件;
  4. 此文章用的USB协议是《ORSSerialPort》,目前也就基本是这个对接硬件设备,相互链接进行收发数据的。
  5. 逻辑:电脑监听usb接口~是否有设备链接~一旦有链接就进行读取名称~设置波特率~打开串口~上传固件文件(这块就需要与硬件工程师对接协议了)~发送字节数据~接收设备数据;

该具备的硬件与软件:

  1. MAC电脑一台,键盘,鼠标;
  2. Xcode编译器;
  3. 终端设备,开发板一块,如:stm32;
  4. USB数据线一根;
  5. 准备好一个文件,有一个升级的功能;

一:创建桌面程序

1,打开xcode编译器,选择fiie-New-Probject-macos-app-next;
在这里插入图片描述
2,创建项目名称了,这个自己定义了哦,下面的默认不要管。
在这里插入图片描述
3,桌面程序项目创建完成,这是我的总项目架构;
在这里插入图片描述
二:USB接口开发

1.上面就讲了,用的ORSSerialPort协议,如果有不了解的,也可以网上看看这个协议。

#import <Cocoa/Cocoa.h>
#import "CustomProgress.h"
#import "MIDIManager.h"
#import "ORSSerialPort.h"

@class ORSSerialPortManager;

@interface ViewController : NSViewController <ORSSerialPortDelegate,MidiGetDataDelegate, NSUserNotificationCenterDelegate,NSTextViewDelegate,NSTableViewDelegate>
@property (weak) IBOutlet NSArrayController *DeviceArray;

@property (weak) IBOutlet NSButton *OpenOrClose;

@property (weak) IBOutlet NSTextField *StatusText;
@property (weak) IBOutlet NSTextField *PassageD;

@property (weak) IBOutlet NSTextField *TextNameH;

//@property (weak) IBOutlet NSTextField *RXCounter;
//@property (nonatomic, assign) long RXNumber;

@property (nonatomic, strong) NSData * sendData;

//@property (weak) IBOutlet NSTextField *TXCounter;
//@property (nonatomic, assign) long TXNumber;

@property (weak) IBOutlet NSTextField *filePathTF;
@property (weak) IBOutlet NSButton *OpenBut;
@property (weak) IBOutlet NSButton *UpdateBut;
@property (weak) IBOutlet CustomProgress *processView;

@property (unsafe_unretained) IBOutlet NSTextView *RXDataDisplayTextView;

@property (unsafe_unretained) IBOutlet NSTextView *TXDataDisplayTextView;
@property (weak) IBOutlet NSMatrix *stringType;
@property (weak) IBOutlet NSMatrix *stringType_TX;

@property (weak) IBOutlet NSTextField *TimeInternel;
@property (weak) IBOutlet NSTextField *countOfSend;
@property (weak) IBOutlet NSButton *SendButton;

@property (nonatomic, assign) BOOL isRXHexString;

@property (nonatomic, assign) BOOL isTXHexString;

@property (nonatomic, assign) BOOL isRXGBKString;
@property (nonatomic, assign) BOOL isTXGBKString;

@property (nonatomic, strong) ORSSerialPortManager *serialPortManager;
@property (nonatomic, strong) ORSSerialPort *serialPort;//ORSSerialPort
@property (nonatomic, strong) NSArray *availableBaudRates;
@property (weak) IBOutlet NSTableView *tableviewFordevices;

@property (nonatomic,strong) NSSavePanel*  panel;
@property (nonatomic, assign) BOOL isLoopSend;
@property (nonatomic, assign) BOOL isWorkInSend;
@property (nonatomic, assign) BOOL isOnlyDisplayRxData;
@property (assign,nonatomic) int sendCount;
@property (assign,nonatomic) NSTimer *timer;
@property (nonatomic, strong) NSWindow *MyMoneyWindow;
@end

2,设置打开串口的代码

- (IBAction)openComPort:(id)sender {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        self.serialPort.isOpen ? [self.serialPort close] : [self.serialPort open];
    });
}

3.发送数据

//如果串口没打开,不能发生数据
-(void)sendDataWithPort{
    
    if (!self.serialPort.isOpen) {
        self.StatusText.stringValue = @"The serial port is not open and cannot send data.";
        return;
    }

        if(_sendData){
               if([self.serialPort sendData:_sendData]){
                   self.StatusText.stringValue = @"发送HEX数据成功";
                  // self.TXCounter.stringValue = [NSString stringWithFormat:@"%@",_sendData];
               }else{
                   self.StatusText.stringValue = @"发送HEX数据失败";
                   return;
               }
           }

4.打开串口,关闭串口;

#pragma mark - ORSSerialPortDelegate Methods

- (void)serialPortWasOpened:(ORSSerialPort *)serialPort
{
    self.OpenOrClose.title = @"Close the serial port";
    self.StatusText.stringValue = @"Serial port is open";
}

- (void)serialPortWasClosed:(ORSSerialPort *)serialPort
{
    self.OpenOrClose.title = @"Open serial port";
    self.StatusText.stringValue = @"Serial port is closed";
}

5.程序启动的时候,读取到usb插入的设备;

#pragma mark - Properties

- (void)setSerialPort:(ORSSerialPort *)port
{
    if (port != _serialPort)
    {
//      [_serialPort close];
        _serialPort.delegate = nil;
        _serialPort = port;
        _serialPort.delegate = self;
        self.OpenOrClose.title = self.serialPort.isOpen ? @"Close the serial port" : @"Open serial port";
        NSString *tmp=[NSString stringWithFormat:@"%@%@",_serialPort.name,(self.serialPort.isOpen ? @"Serial port is open" : @"Serial port is closed")];
        self.StatusText.stringValue = tmp;
    }
}

6,点击上传的按钮

- (IBAction)GDeviceFile:(NSButton *)sender {
    NSLog(@"我选择了 : OpenBut");
    [self openFinder];
}

- (void)openFinder{
    NSOpenPanel *panel = [NSOpenPanel openPanel];
    
    [panel setCanChooseFiles:YES];  //是否能选择文件file
    
    [panel setCanChooseDirectories:YES];  //是否能打开文件夹
    
    [panel setAllowsMultipleSelection:NO];  //是否允许多选file
    
    NSInteger finded = [panel runModal];   //获取panel的响应
    
    if (finded == NSModalResponseOK) {
        
        for (NSURL *url in [panel URLs]) {
            
            NSLog(@"文件路径--->%@",url);
            _filePathTF.stringValue = [NSString stringWithFormat:@"%@",url];
            self.TextNameH.stringValue = [NSString stringWithFormat:@"%@",url];
            //同时这里可以处理你要做的事情 do something
            
            // 获取文件内容
            NSFileHandle *fileHandle = [NSFileHandle fileHandleForReadingFromURL:url error:nil];
            _sendData = [fileHandle readDataToEndOfFile];
            NSLog(@"内容 ==  %@",_sendData);
            
        }
    }
}

7,当设备(开发版)断开的时候,监测;

- (void)postUserNotificationForDisconnectedPorts:(NSArray *)disconnectedPorts
{
#if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_7)
    if (!NSClassFromString(@"NSUserNotificationCenter")) return;
    
    NSUserNotificationCenter *unc = [NSUserNotificationCenter defaultUserNotificationCenter];
    for (ORSSerialPort *port in disconnectedPorts)
    {
        NSUserNotification *userNote = [[NSUserNotification alloc] init];
        userNote.title = NSLocalizedString(@"侦测到串口线断开", @"侦测到串口线断开");
        NSString *informativeTextFormat = NSLocalizedString(@"串口设备 %@ 已从你的 Mac电脑断开物理连接.", @"Serial port disconnected user notification informative text");
        userNote.informativeText = [NSString stringWithFormat:informativeTextFormat, port.name];
        userNote.soundName = nil;
        [unc deliverNotification:userNote];
    }
#endif
}

8,当设备(开发版)重链接的时候,监测;

- (void)postUserNotificationForConnectedPorts:(NSArray *)connectedPorts
{
#if (MAC_OS_X_VERSION_MAX_ALLOWED > MAC_OS_X_VERSION_10_7)
    if (!NSClassFromString(@"NSUserNotificationCenter")) return;
    
    NSUserNotificationCenter *unc = [NSUserNotificationCenter defaultUserNotificationCenter];
    for (ORSSerialPort *port in connectedPorts)
    {
        NSUserNotification *userNote = [[NSUserNotification alloc] init];
        userNote.title = NSLocalizedString(@"侦测到串口线连接", @"侦测到串口线连接");
        NSString *informativeTextFormat = NSLocalizedString(@"串口设备 %@ 已经连接到你的 Mac电脑.", @"Serial port connected user notification informative text");
        userNote.informativeText = [NSString stringWithFormat:informativeTextFormat, port.name];
        userNote.soundName = nil;
        [unc deliverNotification:userNote];
    }
#endif
}

9.把核心的代码以上阐述了,点击运行,看图:
在这里插入图片描述
在这里插入图片描述
10.把写好的桌面程序,打包成dmg,可以参考此文章:打包项目的链接

此文章先描述到此为止了,希望能帮助到更多的看官初学者,如果有任何疑问可以留言,相互学习,谢谢,一起努力,下期见~~

源码:

本项目的Demo,详细的源码

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
开发mac桌面程序的usb串口调试助手是一个功能强大的工具,旨在简化和提升串口设备的调试过程。下面是该助手的特点和开发流程: 该调试助手具有以下特点: 1. 用户友好的界面:助手的界面简洁直观,用户可以轻松找到所需功能。 2. 支持多种串口设备:助手可以与各种串口设备进行通信,包括Arduino、Raspberry Pi等。 3. 数据监控和分析:助手能够实时监控串口数据流,用户可以查看发送和接收的数据。 4. 发送和接收数据:用户可以输入要发送的数据,助手将其发送至串口设备,并显示设备传回的响应数据。 5. 高级调试功能:助手还提供了一些高级调试功能,如数据包分析、校验和校正等。这些功能有助于更深入地理解和解决串口通信中的问题。 开发该助手的流程如下: 1. 确定需求:和潜在用户进行沟通,了解他们的需求并收集反馈,从而制定功能和界面设计。 2. 界面设计:根据需求和用户体验设计界面,保持简洁直观,方便用户操作。 3. 编写代码:使用合适的编程语言(如Objective-C或Swift)编写代码,包括串口设备的连接、数据发送和接收等功能。 4. 调试和测试:通过模拟串口设备、发送测试数据等方法,进行调试和测试,确保助手的稳定性和功能完整性。 5. 用户反馈和更新:发布初版后,根据用户反馈进行调整和改进,修复bug,并定期发布更新版本。 通过开发mac桌面程序的usb串口调试助手,可以帮助工程师们更方便地进行串口设备的调试工作,提高开发效率,并提供更好的用户体验。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值