Objective c 读取串行端口iOS

Objective c 读取串行端口iOS,objective-c,serial-port,ios10,root,jailbreak,Objective C,Serial Port,Ios10,Root,Jailbreak,在iOS 10.3.3越狱iPhone 6S上,我有以下代码可以读写串行端口(我使用h3lix越狱): 序列号.h: // // Serial.h // iOUSB // // Created by Brandon on 2018-05-21. // Copyright © 2018 XIO. All rights reserved. // #if !defined(__cplusplus) //-fmodules -fcxx-modules @import Foundation;

在iOS 10.3.3越狱iPhone 6S上,我有以下代码可以读写串行端口(我使用h3lix越狱):

序列号.h:

//
//  Serial.h
//  iOUSB
//
//  Created by Brandon on 2018-05-21.
//  Copyright © 2018 XIO. All rights reserved.
//

#if !defined(__cplusplus)  //-fmodules -fcxx-modules
@import Foundation;
#else
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wauto-import"
#import <Foundation/Foundation.h>
#pragma clang diagnostic pop
#endif

#define BAUD_RATE 9600

@interface Serial : NSObject
+ (instancetype)shared;
- (bool)setup:(NSString *)filePath;
- (bool)disconnect;
- (size_t)available;
- (size_t)read:(uint8_t *)bytes length:(int32_t)length;
- (size_t)write:(uint8_t *)bytes length:(int32_t)length;
- (void)flushInputStream;
- (void)flushOutputStream;
- (void)flush;
- (NSString *)lastError;
- (void)eraseLastError;
@end
//
//连载
//iOUSB
//
//布兰登于2018年5月21日创作。
//版权所有©2018 XIO。版权所有。
//
#如果!已定义(uu cplusplus)/-fmodules-fcxx模块
@进口基金会;
#否则
#pragma-clang诊断推送
#pragma-clang诊断被忽略“-Wauto-import”
#进口
#pragma-clang诊断流行语
#恩迪夫
#定义波特率9600
@接口序列号:NSObject
+(instancetype)共享;
-(bool)设置:(NSString*)文件路径;
-(bool)断开连接;
-(尺寸)可用;
-(size_t)读取:(uint8_t*)字节长度:(int32_t)长度;
-(size_t)write:(uint8_t*)字节长度:(int32_t)长度;
-(无效)flushInputStream;
-(void)flushOutputStream;
-(无效)齐平;
-(NSString*)最后一个错误;
-(无效)删除错误;
@结束
Serial.mm:

//
//  Serial.mm
//  iOUSB
//
//  Created by Brandon on 2018-05-21.
//  Copyright © 2018 XIO. All rights reserved.
//

#import "Serial.h"
#include <fstream>
#include <iostream>
#include <sys/fcntl.h>
#include <sys/stat.h>
#include <sys/ioctl.h>
#include <termios.h>
#include <unistd.h>

#define DEFAULT_BAUD_RATE 9600

@interface Serial()
@property (nonatomic, assign) int file_descriptor;
@property (nonatomic, strong) NSString *lastError;
@end

@implementation Serial
+ (instancetype)shared {
    static Serial *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[Serial alloc] init];
    });
    return instance;
}

- (instancetype)init {
    if ((self = [super init])) {
        self.file_descriptor = -1;
        self.lastError = nil;
    }
    return self;
}

- (void)dealloc {
    [self disconnect];
}

- (bool)setup:(NSString *)filePath {
    if (self.file_descriptor != -1)
    {
        return true;
    }

    self.file_descriptor = open(filePath.UTF8String, O_RDWR | O_NOCTTY | O_NDELAY | O_NONBLOCK);
    if (self.file_descriptor == -1)
    {
        const char* error = strerror(errno);
        self.lastError = [[NSString alloc] initWithUTF8String:error];
        perror(error);
        return false;
    }

    struct termios options;
    struct termios oldoptions;
    tcgetattr(self.file_descriptor, &oldoptions);
    options = oldoptions;

    #if !defined(_POSIX_C_SOURCE) || defined(_DARWIN_C_SOURCE)
    int baud_rates[] = {B0, B50, B75, B110, B134, B150, B200, B300, B1200, B1800, B2400, B4800, B9600, B19200, B38400, B7200, B14400, B28800, B57600, B76800, B115200, B230400
    };
    #else
    int baud_rates[] = {B0, B50, B75, B110, B134, B150, B200, B300, B1200, B1800, B2400, B4800, B9600, B19200, B38400};
    #endif

    auto it = std::find(std::begin(baud_rates), std::end(baud_rates), BAUD_RATE);
    if (it != std::end(baud_rates))
    {
        cfsetispeed(&options, *it);
        cfsetospeed(&options, *it);
        std::cout<<"BAUD_RATE Set Successfully!\n";
    }
    else
    {
        cfsetispeed(&options, DEFAULT_BAUD_RATE);
        cfsetospeed(&options, DEFAULT_BAUD_RATE);
        std::cerr<<"Invalid BAUD_RATE.. Setting to default: "<<DEFAULT_BAUD_RATE<<"\n";
    }

    options.c_cflag |= (CLOCAL | CREAD);
    options.c_cflag |= CS8;
    options.c_cflag &= ~PARENB;
    options.c_cflag &= ~CSTOPB;
    options.c_cflag &= ~CSIZE;
    tcsetattr(self.file_descriptor, TCSANOW, &options);
    return true;
}

- (bool)disconnect {
    if (self.file_descriptor != -1)
    {
        close(self.file_descriptor);
        self.file_descriptor = -1;
        self.lastError = nil;
    }

    return self.file_descriptor == -1;
}

- (size_t)available {
    if (self.file_descriptor == -1)
    {
        return -1;
    }

    int available = -1;
    ioctl(self.file_descriptor, FIONREAD, &available);
    return available;
}

- (size_t)read:(uint8_t *)bytes length:(int32_t)length {
    if (self.file_descriptor == -1)
    {
        return -1;
    }

    ssize_t bytesRead = read(self.file_descriptor, bytes, length);
    if (bytesRead < 0)
    {
        const char* error = strerror(errno);
        self.lastError = [[NSString alloc] initWithUTF8String:error];
        perror(error);
    }
    return bytesRead;
}

- (size_t)write:(uint8_t *)bytes length:(int32_t)length {
    if (self.file_descriptor == -1)
    {
        return -1;
    }

    ssize_t bytesWritten = write(self.file_descriptor, bytes, length);
    if (bytesWritten <= 0)
    {
        const char* error = strerror(errno);
        self.lastError = [[NSString alloc] initWithUTF8String:error];
        perror(error);
    }
    return bytesWritten;
}

- (void)flushInputStream {
    if (self.file_descriptor == -1)
    {
        return;
    }

    tcflush(self.file_descriptor, TCIFLUSH);
}

- (void)flushOutputStream {
    if (self.file_descriptor == -1)
    {
        return;
    }

    tcflush(self.file_descriptor, TCOFLUSH);
}

- (void)flush {
    if (self.file_descriptor == -1)
    {
        return;
    }

    tcflush(self.file_descriptor, TCIOFLUSH);
}

- (NSString *)lastError {
    return _lastError ?: @"";
}

- (void)eraseLastError {
    _lastError = nil;
}
@end
//
//Serial.mm
//iOUSB
//
//布兰登于2018年5月21日创作。
//版权所有©2018 XIO。版权所有。
//
#导入“Serial.h”
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义默认波特率9600
@接口串行()
@属性(非原子,赋值)int file_描述符;
@属性(非原子,强)NSString*lastError;
@结束
@实现序列
+(instancetype)共享{
静态串行*实例;
静态调度一次;
一次发送(一次发送)^{
实例=[[Serial alloc]init];
});
返回实例;
}
-(instancetype)初始化{
if((self=[super init])){
self.file_描述符=-1;
self.lastError=nil;
}
回归自我;
}
-(无效)解除锁定{
[自断开];
}
-(bool)设置:(NSString*)文件路径{
if(self.file_描述符!=-1)
{
返回true;
}
self.file_descriptor=open(filePath.UTF8String,O_RDWR | O_NOCTTY | O_NDELAY | O|u NONBLOCK);
if(self.file_描述符==-1)
{
const char*error=strerror(errno);
self.lastError=[[NSString alloc]initWithUTF8String:error];
佩罗(错误);
返回false;
}
结构termios选项;
结构termios-oldpoptions;
tcgetattr(self.file\u描述符和oldoptions);
选项=旧选项;
#if!已定义(_POSIX_C_SOURCE)|已定义(_DARWIN_C_SOURCE)
int波特率[]={B0、B50、B75、B110、B134、B150、B200、B300、B1200、B1800、B2400、B4800、B9600、B19200、B38400、B7200、B14400、B28800、B57600、B76800、B115200、B230400
};
#否则
int波特率[]={B0、B50、B75、B110、B134、B150、B200、B300、B1200、B1800、B2400、B4800、B9600、B19200、B38400};
#恩迪夫
自动it=std::find(std::begin(波特率)、std::end(波特率)、波特率);
if(it!=std::end(波特率))
{
cfsetispeed(&options,*it);
cfsetospeed(&options,*it);

std::cout默认情况下,串行端口用作带外管理接口(允许您在网络关闭时通过串行连接连接到系统)

在将串行端口重新用于任何其他用途之前,需要禁用此功能


具体操作方法因操作系统版本而异。

您是否插入了USB到RS232适配器?(您说您插入了“设备”,但我不知道您指的是Lightning/USB-3适配器还是USB/RS232适配器。)对于您的情况,基于串口的终端支持是通过StartupItem()控制的。了解这一点,您应该找到文件/System/Library/StartupItems/SerialTerminalSupport。查找ENABLE SERIALTERMINAL并将其更改为$FALSE