# OC串口工具 **Repository Path**: andrew-wang-bojie/oc-serial-port-tool ## Basic Information - **Project Name**: OC串口工具 - **Description**: 个人在公司做的练习小项目,使用objective-c封装了C语言的串口工具,并且写了一些管理模块进行管理运行,无GUI,纯控制台版本。 - **Primary Language**: Objective-C - **License**: AGPL-3.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 2 - **Created**: 2021-03-22 - **Last Updated**: 2025-01-13 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # serialTest/串口小工具 简介:这个是我在实习工作的时候初学Objective-C写的串口小工具练习,一个串口通讯的小工具(没有GUI),先是通过C语言的方式进行学习,再利用OC消息对象的思维将原本C语言的底层重写,封装成类,用时大概一周,OC语法学习了一周。 ![architecture](./serialTest/doc/img/architecture.png) 代码主要分为以下几个部分(由底层往上) - serial模块,底层的串口通讯类模块 - checkInput模块,检查输入模块 - devSearch模块,搜索设备模块 - buildInCommand模块,内置命令模块 - terminalControl模块,操作控制模块(主函数直接调用它) - printReadBuff模块,将传递而来的内容进行规定格式输出 ------ ### serial模块 简介:底层的连接串口,配置串口内容,给串口上锁,读写数据,断开连接串口等基础的串口操作的封装模块,此外还有一个状态读取和配置检查。 - serialOpen 打开一个tty或者cu的串口文件 - serialConfig 给该文件上锁,并且给该文件设置基本配置内容 - serialClose 关闭该文件 - serialRead 读取该文件发送过来的信息 - serialWrite 写入改文件并且发送信息到串口 关于其他的串口配置文件,都比较底层需要调用到C的一些操作库相关的内容,我也做了一个笔记,可以跳转到这里进行阅读:[串口笔记](./serialTest/doc/serialLearn.md) ------ ### checkInput模块 简介:在进行配置的人工输入的时候检查是否符合规范,核心调用checkConfigInputRight方法并由此调用各种需要检查正确性的子方法中。 - checkConfigInputRight 检查人工输入的内容是否正确 ------ ### devSearch模块 简介:OC是一个苹果系统友好的语言,因此在LINUX/UNIX类型系统中,设备文件均在/dev/目录下,这个模块就是检查这个目录中符合搜索规范的设备文件(利用正则) - searchDevice 搜索LINUX/UNIX目录下/dev/路径下的串口文件 PS:因为OC是Mac平台的,所以从一开始就没有考虑Windows的Com连接方法 ------ ### buildInCommand模块 简介:这是一个在主机发送消息给串口前进行自我检查的模块,可以通过"#命令"的方式输入一些内置命令,比如说结束程序,呼出帮助手册,显示作者信息等,在将来可能还会结合日志模块增加一个串口交互录制的功能,这个模块会访问项目中内置的info.plist文件获取一些最基本的信息。 - initWithPath 初始化info.plist文件的访问内容 - command 内置命令调用,内置命令"#命令"的方式传入 ------ ### terminalControl模块 简介:直接由main函数调用的主程序,核心在于mainMenu方法,它主要分为三个大块,分别是选择设备,打开设备并且运行程序,在本模块中会对其他的相关模块进行调用。 - mainMenu 主菜单,其实就是抽离出来的主函数,这样写起来在观感上面简单直白 - chooseDevice 选择设备 - openDevice 打开并且配置基本设备信息 - running 运行主要的Write/Read的程序,并且启动内置命令模块进行响应 ------ ### printReadBuff模块 简介:在terminalControl定义一个字符变量systemVar(此处system翻译为进制,不是系统),将地址指针传递的方式交由buildInCommand进行控制,该变量将会决定本模块中采取什么样的输出方式,共有原有字符ASCII码输出,二进制输出,八进制输出,十六进制输出等(这样写方便进行扩展,如果以后需要base64输出,UTF-8输出,GBK输出,也可以以较少代码的设计思路增添过来) - print 传递进来ReadBuff,length,mode,由mode选择调用自己类中私有方法去进行特定格式的输出(一种输出模式一种方法) - printByChar 用原ASCII码字符的方式进行输出 - printByBinary 用二进制的方式进行输出(自动用空格分离),二进制输出方式自定义 - printByOctonary 用八进制的方式进行输出(自动用空格分离) - printByHexadecimal 用十六进制的方式进行输出,十六进制会自动补0x PS:在传输的时候返回字符串并不是以\0作为结尾标记的,与单片机等进行交互时,他们回传的内容常常是以\r\n(换行回车)进行标记的,这就导致这一系列的返回函数,统统不能够直接打印,而是需要手动拆分单个字符的方式进行输出,也正因为如此,传递进来的length是如此的有必要。 ------ ### 一些想补上去却因为各种原因没有补的东西 ##### 日志生成模块 整体项目中使用NSLog作为打印信息的交互(在IO这一块个人测试得NSLog比printf,cout慢了差不多300多倍,原因是NSLog会进行一些系统级别的信息记录);printf作为回传信息的打印;整体项目即将完成时希望能够写上一个日志模块,用以记录交互的内容。 但是,在查阅得知,在不改动原有代码的基础上,要想做日志生成,只有利用重定向功能,freopen打开stdout输出流给一个新文件,但这样会造成原有的在终端上输出内容无法显示,后面了解到了freopen是利用dup2函数,再学习深入到了dup,逐步到了C语言底层的一些部分,随后结束了学习没有实现具体功能(毕竟是在工作的小练习,需要掌握时间规划的) ##### 超时断开模块 当时学习做了一个NSTimer和一个GCD的时间控制模块,但是在网上搜代码的时候发现全部都需要引入到viewController中才能进行调用,而无法直接在main中或者另外开一个线程运行,于是卡了很久,直到最近开始学习GUI,cocoa框架了,才逐渐明白他到底是怎么一回事 这些功能和想法我可以在Python上可以轻而易举的实现,归咎没办法在OC上实现的原因还在于对于OC的不熟悉,以及整体的资料偏少,现在已经开始学习GUI,先写一些macOS应用,随后对IOS上制作应用还有一些兴趣也打算逐步的学习。 ------ ### 其他内容 ###### plist文件内容 ![runp1](./serialTest/doc/img/plist.png) ###### importLibary.h 全局头文件引用,为了美观做的,import和include区别就是import可以自动避免重复引用的反复加载问题。也可以改成用.pch文件做这个功能。 ###### old/ 废弃代码文件夹,在正式写完项目后即删除 ###### doc/ 文档项目路径,文件的截图,串口的一些接口学习的函数在此位置 ------ #### 相关的运行截图 ![runp1](./serialTest/doc/img/runp3.png) #### 代码截图 ![code1](./serialTest/doc/img/code1.png) :green_apple: PS: Leader要求注释需要纯英文 ------ ### Author Andrew·Wang -- software development Intership -- mircotesttech www.mustenaka.cn