Objective c 读取串行端口iOS
在iOS 10.3.3越狱iPhone 6S上,我有以下代码可以读写串行端口(我使用h3lix越狱): 序列号.h: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;
//
// 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