Mac下的串口通信-ORSSerialPort
2015-11-05 11:59
363 查看
================================2015/11/05=======================================
最近在工作中遇到有关Mac下串口通信的问题,一开始直接用以前同事写的framework,基本通信没问题,通过一个NSThread对象开启一个线程,在线程中用while循环不断读取数据,如果读到数据,则进行处理。但是一打开串口,CPU的占用率就直接飙到100%,而且读信息的时候很难判断“\r”换行符,于是打算自己重写串口类。
到网上搜索资料,“Mac+串口”,无果,大部分都转往Linux串口方向。虽然很多人都说mac系统跟linux差不多,但是对于小白,概念还是比较模糊的,无从下手。
无意间找到一篇文章:mac下串口通讯工具的编写
看了一下注释,觉着作者写的类不错,于是乎跑到Github,幸运地找到了同名的项目:https://github.com/armadsen/ORSSerialPort
(感谢上面转载的那位博主,没有中文标题,估计跑到GitHub不知得翻到什么时候……)
自己先研究一下,后续再补充。
================================2015/11/06=======================================
经过一天的磨合,终于把自己的小程序搞定。ORSSerialPort这个工程的使用体验很好,用法非常简单,串口通信的应用程序工作状态中CPU的占用率也只有2%~5%左右,程序很顺畅,不会卡死,至于里面的进程机制,抱歉我还没有完全弄清楚,留待以后慢慢看。
今天做个简单总结:
1、ORSSerialPort是什么?
ORSSerialPort是一个使用方便的Objective-C串口库,用于OS X系统下的串口通信。目前有Objective-C和Swift两种版本,可供程序开发者选择。
Source源码是用Objective-C写的。在Swift下使用的话,添加一个Bridge头文件即可。
这里是作者Andrew Madsen的博客,可以围观一下:http://blog.andrewmadsen.com/
2、为什么要用ORSSerialPort?
(1)开源
ORSSerialPort基于MIT软件协议,使用者可以根据自己的需求进行修改和使用。
(2)可以监听数据的接收/响应以及串口的断开/接入等事件。
(3)Key Value Observing
ORSSerialPort的很多属性使用了Key-Value Observing机制,当指定属性被修改后,对象就会收到通知。
3、如何使用ORSSerialPort?
(1)安装
原作者提供了几种将ORSSerialPort加入工程的方法,https://github.com/armadsen/ORSSerialPort/wiki/Installing-ORSSerialPort
总的来说,可将ORSSerialPort编译成framework,然后加入工程中。也可以直接将ORSSerialPort的源码(ORSSerialPort/Source)copy到工程里。推荐使用后者,可以对代码进行修改和调试,也可以清晰地了解串口通信程序编写的过程。
(2)读取一行数据
ORSSerialPort的原代码是不支持一行一行读取数据的。
我的处理方法是:用一个全局的NSMutableString字符串RxString来暂存接收到的数据,每次接收的时候,判断RxString是否包含结束符('\r'),如果包含,则将RxString送入处理函数,然后,将RxString进行清空。
当然,也有其他的解决方案,比如,在ORSSerialPort的源码中进行修改:Mac上一个不错的读串口的库ORSSerialPort。
(3)配置串口
在ORSSerialPort源码中,作者将数据位数写成了8位,如果需要进行配置,可以添加一个DataBits属性。
首先,在ORSSerialPort.h中添加属性的声明:
然后,在ORSSerialPort.m中进行修改- (void)setPortOptions方法:
添加DataBits属性的setter:
修改- (instancetype)initWithDevice:(io_object_t)device:
Done!
================================2015/11/09=======================================
最近在工作中遇到有关Mac下串口通信的问题,一开始直接用以前同事写的framework,基本通信没问题,通过一个NSThread对象开启一个线程,在线程中用while循环不断读取数据,如果读到数据,则进行处理。但是一打开串口,CPU的占用率就直接飙到100%,而且读信息的时候很难判断“\r”换行符,于是打算自己重写串口类。
到网上搜索资料,“Mac+串口”,无果,大部分都转往Linux串口方向。虽然很多人都说mac系统跟linux差不多,但是对于小白,概念还是比较模糊的,无从下手。
无意间找到一篇文章:mac下串口通讯工具的编写
看了一下注释,觉着作者写的类不错,于是乎跑到Github,幸运地找到了同名的项目:https://github.com/armadsen/ORSSerialPort
(感谢上面转载的那位博主,没有中文标题,估计跑到GitHub不知得翻到什么时候……)
自己先研究一下,后续再补充。
================================2015/11/06=======================================
经过一天的磨合,终于把自己的小程序搞定。ORSSerialPort这个工程的使用体验很好,用法非常简单,串口通信的应用程序工作状态中CPU的占用率也只有2%~5%左右,程序很顺畅,不会卡死,至于里面的进程机制,抱歉我还没有完全弄清楚,留待以后慢慢看。
今天做个简单总结:
1、ORSSerialPort是什么?
ORSSerialPort是一个使用方便的Objective-C串口库,用于OS X系统下的串口通信。目前有Objective-C和Swift两种版本,可供程序开发者选择。
Source源码是用Objective-C写的。在Swift下使用的话,添加一个Bridge头文件即可。
这里是作者Andrew Madsen的博客,可以围观一下:http://blog.andrewmadsen.com/
2、为什么要用ORSSerialPort?
(1)开源
ORSSerialPort基于MIT软件协议,使用者可以根据自己的需求进行修改和使用。
(2)可以监听数据的接收/响应以及串口的断开/接入等事件。
(3)Key Value Observing
ORSSerialPort的很多属性使用了Key-Value Observing机制,当指定属性被修改后,对象就会收到通知。
3、如何使用ORSSerialPort?
(1)安装
原作者提供了几种将ORSSerialPort加入工程的方法,https://github.com/armadsen/ORSSerialPort/wiki/Installing-ORSSerialPort
总的来说,可将ORSSerialPort编译成framework,然后加入工程中。也可以直接将ORSSerialPort的源码(ORSSerialPort/Source)copy到工程里。推荐使用后者,可以对代码进行修改和调试,也可以清晰地了解串口通信程序编写的过程。
(2)读取一行数据
ORSSerialPort的原代码是不支持一行一行读取数据的。
我的处理方法是:用一个全局的NSMutableString字符串RxString来暂存接收到的数据,每次接收的时候,判断RxString是否包含结束符('\r'),如果包含,则将RxString送入处理函数,然后,将RxString进行清空。
NSMutableString *RxString; -(void)serialPort:(ORSSerialPort *)serialPort didReceiveData:(NSData *)data{ NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if(str.length == 0) return; [RxString appendString:str]; //接收到一行数据 if([RxString containsString:@"\r"]){ if(flagShow){ //处理数据 [self handleReceiveString:RxString]; } //重置RxString RxString=[NSMutableString stringWithString:@""]; } }
当然,也有其他的解决方案,比如,在ORSSerialPort的源码中进行修改:Mac上一个不错的读串口的库ORSSerialPort。
(3)配置串口
在ORSSerialPort源码中,作者将数据位数写成了8位,如果需要进行配置,可以添加一个DataBits属性。
首先,在ORSSerialPort.h中添加属性的声明:
/** --------------------------------------------------------------------------------------- * @name Configuring the Serial Port * --------------------------------------------------------------------------------------- */ //--------------------------------change------------------------------ /** * The number of data bits. Possible values are: 5, 6, 7, or 8. */ @property (nonatomic) NSUInteger numberOfDataBits; //------------------------------end change----------------------------
然后,在ORSSerialPort.m中进行修改- (void)setPortOptions方法:
// Set data bits options.c_cflag &= ~CSIZE; // -----------------change------------------ // options.c_cflag |= CS8; switch (self.numberOfDataBits) { case 5: options.c_cflag |= CS5; break; case 6: options.c_cflag |= CS6; break; case 7: options.c_cflag |= CS7; break; case 8: options.c_cflag |= CS8; break; default: break; } // -------------end change------------------
添加DataBits属性的setter:
//-----------------change------------------------------- -(void)setNumberOfDataBits:(NSUInteger)numberOfDataBits{ if(numberOfDataBits != _numberOfDataBits){ _numberOfDataBits = numberOfDataBits; [self setPortOptions]; } } //-----------------end change---------------------------
修改- (instancetype)initWithDevice:(io_object_t)device:
self.requestsQueue = [NSMutableArray array]; // ---------------change----------------- self.numberOfDataBits = 8; // ----------------end change ----------- self.baudRate = @B19200; self.allowsNonStandardBaudRates = NO; self.numberOfStopBits = 1; self.parity = ORSSerialPortParityNone; self.shouldEchoReceivedData = NO; self.usesRTSCTSFlowControl = NO; self.usesDTRDSRFlowControl = NO; self.usesDCDOutputFlowControl = NO; self.RTS = NO; self.DTR = NO;
Done!
================================2015/11/09=======================================
相关文章推荐
- PHPCMS v9设置文章的审核功能
- 堆排序
- SQL语法概要
- sql日期函数
- OC基础 类方法,成员变量,静态变量,全局变量
- tomcat nginx默许的post大小限制
- Android 支付宝支付功能封装实现
- 内存溢出
- HTML5里的placeholder属性
- 集群、分布式你想好怎么用了吗?
- nginx 安装 windows service,gzip压缩
- mesos框架编译部署
- Xcode7.x中安装Alcatraz
- 3dmax2012安装出现应用程序无法启动(0xc0000007)解决方法
- 初学RabbitMQ之HelloWorld
- desgn partten : 适配器&门面
- Python字符串格式转换
- 5.2 模型表示
- 5.1 3D幻境
- 面向对象三大特性之多态性