掌上单片机实验室 – 用PC作为UI (8)

一、背景

        前面构建掌上实验室程序框架时,提出了用串口作为单片机人机交互界面的概念,并在框架中将串口命令接收、串口数据发送作为基础功能编写完成。

        程序框架具备了串口作为 UI 的能力,就需要有相应的外设与其配合,以实现所需的人机交互功能。前面提过,PC是可选的设备之一。本篇就以 PC 为载体,配合前述程序框架的串口收发功能,实现初步的人机交互,即:UI。

二、需求

        用PC作为掌上实验室的UI,其基本需求为:

        1)便于学习单片机的朋友实现,编程门槛不能太高;

        2)可以灵活设计所需的界面,直观的操作掌上实验室、获取所关注的数据。

        3)解决通讯协议手工构建、解析的麻烦,因为协议通常包含校验,以及一些格式性的内容,以往用标准的串口助手程序,手工输入通讯命令很麻烦,获取的结果也不直观。要能根据协议自动构建命令帧、自动提取返回帧中的数据。

        4)有较灵活的扩展能力,可跟随掌上实验室的学习需求变化。

        5)编程语言最好是开源的,没有版权纠葛。随着版权意识的增强,再肆无忌惮地使用盗版软件似乎有些不妥。

三、编程语言选择

        为满足第一个需求,编程语言及环境的选择尤为重要。

        我初期学习在PC上编程时,选择的是 VC6.0,有点困难,主要是PC上的程序运行方式与单片机完全不同,它是基于 Windows 系统的,同时 VC 环境提供了大量的基础功能。这些是很好,但要消化、吃透这些并非易事。

        对于搞单片机的朋友而言,多数是非计算机专业的朋友,学习门槛有点高。

        如果只是想用 PC 作为辅助工具、UI界面,要花那么多精力在此,似乎有点本末倒置。估计就是这个原因,很多搞单片机的朋友至今还是用传统的显示方式(LCD屏、LED数码管),或者用串口助手调试。

        自从通过 Arduino 知道 Processing 后,就觉得这是玩单片机的朋友使用 PC 编程的最佳选择!

        首先,它似乎是 Arduino 的近亲,编程界面基本一样:

        其次,它将Java 封装后,可以不必过分受制于 Java 语法限制,我基本上就是按 C 的写法编写,个别地方略微改变一下即可。当然,不能使用指针了。

        第三,它有丰富的库可以用,这点和 Arduino 一样,且均为开源。

        第四,它的图形输出功能很好,原来我学习用 VC 编程时,为输出图形伤透脑筋。

        第五、它可以直接用 Java 函数编程,有些功能 Processing 自身的函数不支持,可以直接拷贝 Java 程序实现,我在计算两个日期之间的间隔天数时就这样做过。

        第六、它不只是支持 PC 下的 Java 环境,还支持了Android 和 Python,Python 我未尝试,Android 试过几次,和 PC 上编程感觉一样,大大降低了手机编程的门槛。

        最后一点:它是开源的,在如今版权意识越来越普及的趋势下,相对于使用盗版的 VS等商用软件,它无疑更适合。

        和Arduino 一样,Processing 也有很多分享的库可以使用。

        在 Processing 环境下,还有个控制台,可以在程序中使用 print 语句输出调试信息,和掌上实验室所设计的调试信息输出功能一样,可方便哪协助调试自己编写的 UI 程序。

        如果不是要编写商业程序,只是为了辅助单片机开发,将 PC 作为工具、人机交互界面,Processing 是最佳选择。

        Processing 官网:processing.org

四、设计

        和掌上实验室的程序框架相对应,此处要实现的功能有:

        1)按协议实现串口数据收发;

        2)按协议组成发送帧、解析应答帧;

        3)实现方便的操作参数输入、操作命令发送,也就是人机交互。

        4)针对掌上实验室程序框架所实现的基础功能 —— 内存读写,实现相应的操作交互。

        此程序只是为了作为掌上实验室的 UI,所以重点是方便实现,而不是编程学习,故使用单片机学习者最常用的架构:循环、查询方式。

        Processing 的程序有它自己的程序框架,由两个基础函数组成:

        A)Setup()函数:启动后只运行一次,我们将一些初始化的内容放置于此。        

        B)Draw()函数:相当于单片机“裸奔”程序的 While(1)循环,只是要注意一点 —— 一定不能在里面再使用 while(1)循环了!因为这个函数每执行一次,会刷新显示输出一次,正如函数名所示。如果一直停在 Draw()函数中,则不会刷新显示。失去了 UI 的功能。同时,由于此机制,在编程时应确保自己的程序不过分占用时间,以免导致显示滞后。这种架构实时性略差,但作为基于串口交互的 UI 功能而言,问题不大,因为串口的接收由 OS 保证,不会因Draw()函数的低速而丢失数据。

        Processing 和 Arduino 一样,支持多文件编程,只需将文件和主文件放在一个目录下即可,主文件必须和目录同名。

        估计是由于它的设计初衷和 Arduino 一样,是服务于非计算机专业的,所以在语法上十分宽容,只要在函数外定义的均为全局变量,不管是在哪个文件中声明,所有文件均可享用,无需费劲地声明 Public、extern,虽说不严谨,倒也方便。

        按上述需求,程序设计了四个模块(文件):

        1)主模块:完成初始化及主循环,调度各基本功能工作;

        2)串口收发模块:完成按协议的数据收发功能;

        3)UI模块:完成人机交互显示。

        4)内存读写模块:实现掌上实验室框架程序中的内存读写操作界面。

        程序的核心是串口收发及UI。

        串口发送组帧没什么困难,Processing 有封装好的 Write()函数。

        串口接收需要自己编写“按协议提取数据”的功能,我基本是将单片机上的程序拷贝过来,基本不用改就能使用。

        UI 部分要实现的只有两个基本功能:命令参数输入、命令执行

        曾打算用别人分享的库,但查找了一下,发现都有点复杂,也许是人家编写库是为了适用于不同的场景,功能多了自然复杂。

        此处没有那么多需求,花时间消化它们有点得不偿失,故自己用 Java 类方式构建了两个基本操作按钮:

        1)输入按钮,实现参数输入;

         2)操作按钮,触发命令发送。

        用这些按钮和一些文字输出组合,基本满足了所有的需求。如内存读写操作界面:

        操作时注意:输入参数必须使用“Enter”键确认。

        具体程序见附件,可以在此基础上方便地添加自己所需的功能。

五、总结

        这是一个辅助工具,虽说没有直接使用现成的串口助手类软件来的快,但后续带来的好处是明显的,调试效率会大大提高,而且会帮助单片机侧的功能提升,对学习者而言,也是极其有益的,PC的资源丰富,可以发挥的空间更大,且可以记录海量数据,带来 LCD、LED 显示无法比拟的优势。

        工欲善其事,必先利其器。

        而且这个 UI 界面的编程也是侧重于程序逻辑,而非 IDE 工具本身,对编程能力的提升有很大帮助。

        后期可以逐步尝试基于 Ardriod 模式编写手机程序,这样单片机的 UI 界面将更加灵活。

——————————

文中程序下载:

链接:https://pan.baidu.com/s/1K9-HHjRywWoQ7pR37CLKpQ

提取码:znjh

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值