博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
命令及串口命令_单片机很好玩5,花三分钟,学会使用电脑发送“命令”控制单片机...
阅读量:6692 次
发布时间:2019-06-25

本文共 2161 字,大约阅读时间需要 7 分钟。

前面两节讨论了如何利用 C语言编程单片机,控制普通 LED 小灯实现类似手机上面的“呼吸灯”,但是这两节介绍的方法交互性比较差,一旦程序烧写,就无法再从外界控制 LED 小灯的动作了。

4781011ce54596c27c505a865e60e561.png

提升交互性

所以,上一节介绍了单片机和电脑通信的方法,旨在能够通过电脑发送命令给单片机控制 LED 小灯的动作。例如制定以下协议:

  • 电脑端输入 led twinkle 命令,单片机立刻控制 LED 小灯闪烁。
  • 电脑端输入 led breath 命令,单片机立刻控制 LED 小灯成为“呼吸灯”。
  • 电脑端输入 led off 命令,单片机立刻关闭 LED 小灯。

最终实现如下效果:

b0020e4bc9396dace366895fa33f52a2.gif

使用更加轻量级的通信函数

上一节说到,keil 将 printf 的输出重定向到串口后,51 单片机也能很方便的使用 printf 将内部信息传输给电脑端。但是,使用这种方法开销非常大:

128d03a1181c33865e290188d3adb7a1.png

可以看出,上面的C语言代码仅比下面代码多了一个 printf(“”) 函数,最终编译生成的代码 size 却多处近 1 倍!这对于资源匮乏的 51 单片机来说,是不可接受的。因此自己实现一个轻量级的通信函数是非常必要的。

这其实也是嵌入式程序开发的特点,不能浪费甚至一个字节。所以,嵌入式程序员都是勤俭持家的好手。

那么,怎样实现轻量级的 printf 函数呢?嵌入式开发中常见的还有一个词——“裁剪”。顾名思义,就是为了节约资源,嵌入式程序员常常把一个模块中用不到的功能剔除,仅留下核心功能。

现在想想,我们仅需 printf 发送字符串的功能,就可以完成需求。所以单片机往电脑端发送数据的C语言函数可以如下定义:

void prints(char* str){ unsigned char i = 0; TI = 0; for(;str[i]!='0'; i++){  SBUF = str[i]; while(!TI); TI = 0; }}

代码很简单,prints() 函数将 str 逐字节传递给 SBUF 寄存器,单片机则会自动将 SBUF 中的数据传输到串口,并且传送完毕后,将 TI 寄存器置 1。

制定协议,实现电脑用“命令”控制 LED 小灯

现在通信没问题了,那么怎样实现“命令”控制 LED 小灯呢?可以这么干:单片机随时检测串口数据,一旦接收到我们前面定义的命令,就做出相应的动作。所以,C语言代码可以如下写:

#define TWINKLE "led twinkle"#define BREATH "led breath"#define LEDOFF "led off"if(is_new_cmd_ready()){ cmd_len = get_uart_cmd(cmd); prints("recv cmd:");prints(cmd);prints(""); if(is_cmd_match(cmd, BREATH, cmd_len)){ prints(" match ");prints(BREATH);prints(""); action = 1; }else if(is_cmd_match(cmd, TWINKLE, cmd_len)){ prints(" match ");prints(TWINKLE);prints(""); action = 2; }else if(is_cmd_match(cmd, LEDOFF, cmd_len)){ prints(" match ");prints(LEDOFF);prints(""); action = 3; }else{ prints(" cmd not match"); action = 0; } }
adc22bce81fbe69f8f9a5778fc1e2419.png

上面的C语言代码中, action 会随着电脑端发送过来的命令做出相应改变。例如,电脑端发送“led twinkle”可以把 action 设置为 1,电脑端发送“led off”,可以让 action 等于 3。

接下来,把相应的 LED 小灯动作写入不同的 action 就可以了:

switch(action){ case 1: // 呼吸灯 break; case 2: // 闪烁的小灯 break; case 3: // 关闭小灯 break; default: break;  }

“呼吸灯”,闪烁小灯,以及关闭小灯的动作前面几节已经介绍过,将其填入即可:

e03fced8e9085fbb644ed497b198516f.png

现在控制程序也就写好了,编译程序并烧写到单片机。

实验,电脑通过发送命令,控制 LED 小灯变化

初始状态如下图,因为电脑端还没有输入相应的命令,所以 LED 小灯处于熄灭状态。

d32eff3a48634b202fa4b20c9fd87816.png

接着,在串口调试工具输入“led twinkle”,发送到单片机:

fda239e5e9ea66a3ce4380529d78e938.png

可以看到 LED 小灯开始闪烁了:

d5fe14fb71db39c769b27cd203e58ff0.gif

然后再在电脑端输入“led breath”,发送到单片机:

2253036177bb55a367d99fdba9ba0f4c.png

会发现 LED 小灯变成呼吸灯了:

de89b882871748aaf572e389418ae3fd.gif

最后再输入“led off”,能够发现 LED 小灯被熄灭了。

9ec210d2d736d6fd4577b2efbef5a94c.png

完整的流程,请看文章开头的视频。

至此,我们就实现了从电脑端发送命令,控制 LED 小灯动作。

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

转载地址:http://kpdoo.baihongyu.com/

你可能感兴趣的文章
哈佛结构 VS 冯*诺依曼结构
查看>>
java日志体系的思考(转)
查看>>
jQuery插件之validation插件
查看>>
C# 使用 NPOI 库读写 Excel 文件
查看>>
ncurses笔记(1)——ncurses库的介绍与安装
查看>>
Codeforces Round #409 (rated, Div. 2, based on VK Cup 2017 Round 2)(A.思维题,B.思维题)
查看>>
Vue.js动画在项目使用的两个示例
查看>>
新概念英语(1-a)句子集锦
查看>>
使用sphinx生成美观的文档
查看>>
js---15深拷贝浅拷贝 原型链
查看>>
MyEclipse快捷键大全(绝对全)
查看>>
ASP.NET Core Web API处理HttpResponseMessage类型返回值的问题
查看>>
leetcode - Interleaving String
查看>>
进程加载与segment
查看>>
[android] 百度地图开发 (一).申请AK显示地图及解决显示空白网格问题
查看>>
时间序列分析算法【R详解】
查看>>
Nginx+ffmpeg的HLS开源服务器搭建配置及开发详
查看>>
无效报表文件路径
查看>>
C程序编译过程浅析【转】
查看>>
BZOJ 1040 ZJOI2008 骑士 树形DP
查看>>