================================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进行清空。

 NSMutableString *RxString;
-(void)serialPort:(ORSSerialPort *)serialPort didReceiveData:(NSData *)data{ NSString *str=[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; if(str.length == )
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 :
options.c_cflag |= CS5;
break;
case :
options.c_cflag |= CS6;
break;
case :
options.c_cflag |= CS7;
break;
case :
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 = ;
// ----------------end change -----------
self.baudRate = @B19200;
self.allowsNonStandardBaudRates = NO;
self.numberOfStopBits = ;
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=======================================

Mac下的串口通信-ORSSerialPort的更多相关文章

  1. WinCE下的串口通信开发(VS2005,VB.Net,VC++)

    WinCE下的串口通信开发(VS2005,VB.Net,VC++)   WinCE下的串口通信开发 一.利用Visual Basic 开发很简单,因为有现成的控件可以直接调用 以VS2005为例,首先 ...

  2. java下的串口通信-RXTX

    关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的 ...

  3. 在ubuntu下利用minicom实现串口通信

    windos有串口调试助手,linux下也有这样的工具——minicom.不过,minicom和linux下的许多工具都一样,也是命令行模式,没有图形化界面供我们享受.作为一款串口调试工具,虽然难看但 ...

  4. Qt串口通信

    1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...

  5. Linux与Windows串口通信

    串口是常用的计算机与外部串行设备之间的数据传输通道,由于串行通信方便易行,所以应用广泛.现在国际上不断有串口新技术及新规格推出,结合社会各方面需要,串口通信发展的空间庞大.串口通讯技术因其自身的优势和 ...

  6. Linux下的串口调试工具——Xgcom

    Linux下的串口调试工具——Xgcom xgcom的下载网址:https://code.google.com/archive/p/xgcom/downloads (1)安装必须的库 apt-get ...

  7. linux与开发板串口通信

    研究了一天的linux串口,结果改了树莓派的系统配置文件config.txt给改了导致系统崩溃....其实我感觉网上的大多数方法都是不符合新版本树莓派的,网上的方法是通过修改系统配置文件后安装mini ...

  8. 多线程串口通信 MFC CSerialPort

    写在前面: 晚上应该继续完成未写完的代码,但Chrome上打开的标签实在太多了,约30个了,必须关掉一些,所以需要把自己看的整理一下然后关掉.本次主要写点MFC环境下多线程串口通信相关的东西,这包括线 ...

  9. 【转】Qt编写串口通信程序全程图文讲解

    本文章原创于www.yafeilinux.com 转载请注明出处. (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自 ...

随机推荐

  1. 创建与合并分支-git入门教程

    在版本回退里,你已经知道,每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支.截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支.HEAD严格来说不是指向提交,而 ...

  2. ThinkPHP中field 方法与getField 方法的区别。

    做项目的时候遇到了一个问题,框架生成的sql与放到navicat中执行.和页面显示出来的结果不太一样. 排查了很久,也没有找到问题. 出现问题的sql如下. $fuck = M(null, null, ...

  3. linux安装ftp组件

    1   安装vsftpd组件 linux系统安装完后,有/etc/vsftpd/vsftpd.conf 文件,是vsftp的配置文件. [root@bogon ~]# yum -y install v ...

  4. WinForm------如何将GridControl数据导出到Excel

    转载: http://www.cnblogs.com/xiaofengfeng/archive/2011/11/22/2258906.html 代码: SaveFileDialog saveFileD ...

  5. ubuntu 安装php7.1

    sudo apt-get update sudo apt-get install -y language-pack-en-base locale-gen en_US.UTF-8 sudo apt-ge ...

  6. Java反射机制<1>

    如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象). 任何一个类如果没有明确地声明继承自哪个父类的 ...

  7. (转)Java API设计清单

    转自: 伯乐在线 Java API设计清单 英文原文 TheAmiableAPI 在设计Java API的时候总是有很多不同的规范和考量.与任何复杂的事物一样,这项工作往往就是在考验我们思考的缜密程度 ...

  8. SVN中Branch和Merge实践

    参考资料:http://blog.csdn.net/eggcalm/article/details/6606520 branch主要用于新功能的开发,开发过程中不断从trunk merge revis ...

  9. Jasper(物联网网络支撑平台公司)的技术为什么这么牛逼?

    Jasper在这个行业积累了十几年,合作的运营商超过30个,合作的行业大咖包括了通用.空客.宝马.特斯拉等几千个行业龙头,还是有很多积累下来的优势的. 一是,Jasper通过积累下来的行业应用经验,针 ...

  10. 知乎布局||offsetTop||侧边栏自动等高

    1.对a标签的详细介绍 直接在a标签使用onclick,怎么去除a的默认链接,onclick="return test()" 注意这里的return 不可舍去,test函数可以直接 ...