设计与开发

单片机接收字符串 小白的单片机之旅——串口接收

小编 2024-10-08 设计与开发 23 0

小白的单片机之旅——串口接收

上节已经说了怎样利用串口实现其发送功能为,并给出里一个实现的demo,作一个通信接口,收发是其最基本的功能,接下来我们一起来看看单片机是如何通过串口接收数据的吧。

首先我们上节所说的发送起始已经涉及到接收了,只是我们上节在发送的时候对端是作为接收来呈现了我们的发送的效果。如下图所示,单片机在代码的控制下循环的发送数据“hello world“,那pc作为接收方,接收了这个数据,并解析出来,只是相较于单纯的串口接收来说,它多做了几步,就是将串口收到的数据,通过usb-串口转换线转换成usb的数据,又通过usb接口将数据送给了运行于PC上的驱动程序,再通过windows系统的系统调用应用程序获取并显示出对应的字符串。

发送验证结果

上面的过程尽管包含了接收,但是涉及的稍微多了一些,有点不太直观。我们看看在单片机最简单的接收流程是怎么样的。简单说来,数据从信号线上以发送端控制下以相关协议格式发送特定格式的bit流,在接收侧,需要以对应的帧格式去解析它,当然一般来说是硬件干了这个事情(当然软件也可以干,只是一般不需要),但是需要接收端设置好帧格式,波特率等参数。硬件依据协议参数解析bit流,校验成功之后(如果设置了)会将数据放在对应的数据寄存器里,等待软件处理。

前面说的是一般串口接收时,软件感知到接收到数据之前发生的事情。因此,一般的mcu串口功能,在上节说的发送的基础上,只需要再使能接收,在合适的时机去接收数据寄存器取数即可。

那什么是“合适的时机”?一个是我们知道需要接收数据的时候,这时候我们可以使用查询等待的方式接收数据(当然一般包含超时参数),查看对应的状态寄存器,如果有接收标记,就去取数据;另一个就是我们根本不知道数据什么时候会来,或者说我们也不想把宝贵的cpu资源浪费在查询等待动作上,这时候我们会使用对应的中断机制,也就是说我们事先配置好对应的中断处理接口,在接收到数据的时候硬件会触发一个中断,最终调用我们配置好的中断处理接口,在该接口中及时完成对应的接收处理动作。

下面我们就看一个最简单的接收demo。

串口初始化

出口基本功能初始化如上,同发送。此处只使用轮询等待方式实现串口接收,在接收到换行符之后,将之前接收到的数据打印出来。实现如下:

实验结果如下:

轮询方式串口接收验证结果

至此我们完成了一个简单的轮询式接收demo,当然实际使用时就算是轮序状态也会设置一个超时参数用以防止死在这里,或者消耗太多时间,各种参数需要根据实际的业务场景进行确定。

下一节我们一起看看基于中断的,更灵活高效的串口接收方式。

51单片机 ESP8266模块 APP控制继电器,物联网DIY入门新手指南

题目

大家好,超子能力有限,技术不高,有什么错误的地方,欢迎批评指正。超子之前写过一篇STM32单片机配合ESP8266的WiFi模块接入阿里云生活物联网平台的DIY实验,有小伙伴问我51单片机能不能实现,答案是能。那么今天超子就给大家介绍下51单片机的实现方法。

程序设计中,我们使用的软件是Keil集成开发环境,C语言编写。如果大家想要程序源码的话,可以私信我,超子不是专业的程序员,水平不高,大家不嫌弃就行。

一说到51单片机的型号那就太多了,因为我们要使用MQTT协议对接阿里云生活物联网平台,所以对RAM空间要求比较多,一些常见的型号比如89C51,89C52,因为RAM空间太少不能用,所以我们本次DIY程序设计使用的单片机型号是STC12LE5A60S2。

ESP8266模块是通过串口AT指令控制的那种,网上有很多,价格也比较便宜,非常适合我们做DIY。

虽然我们前面使用STM32单片机做了第一个DIY设计,但是考虑到有些小伙伴,没有看过,所以超子还是说的详细一点,把每一个步骤再重新走一遍。

图1

首先进入我们自己的阿里云生活物联网平台,然后创建项目,我们就创建一个51单片机DIY项目吧,以后所有51单片机相关的DIY设计,我们都加入到这个项目内。

图2

项目建立完毕后,可以在项目列表中,看到51单片机DIY项目,旁边的第一个DIY设计项目,是上次STM32单片机DIY设计时建立的。然后我们点击51单片机DIY项目,进入项目管理界面。

图3

接下来,我们需要创建新产品。

图4

产品名称就叫51单片机插座,大家也可以起自己喜欢的名字。然后所属品类选择电工照明下的插座。节点类型选择设备,不接入网关,因为ESP8266可以连接WiFi路由器,直接具备接云的能力,所以是直连设备,不需要网关。连网方式一定要注意,虽然ESP8266是WiFi模块,但是不能选择WiFi连网,因为我们使用的是通用的,AT指令控制的ESP8266,没有在阿里云生活物联网平台认证,不兼容阿里云生活物联网平台APP的配网协议,如果我们选择WiFi方式的话,配网过不去,程序设计就无法进行了。所以我们取个巧,使用蜂窝连接方式,跳过阿里云生活物联网平台APP的配网,我们可以用ESP8266模块自己的APP配网或是直接把WiFi的SSID以及密码写在程序里。然后数据格式选择JSON,不适用ID2认证,最后点击完成就行了。

图5

产品建立完成后,我们要先进行第1步的功能定义的设置,我们选择的是电工照明分类下的插座,所以阿里云生活物联网平台自动帮我们添加了电源开关的功能属性。所以这一步我们不需要做什么额外的设置,直接点击下一步:设备调试。

图6

我们新建设备的时候,为了跳过配网协议,所以故意选择了蜂窝的连接方式,所以我们随便选一个通过认证的模组就行,选哪个型号都不会影响我们的DIY设计。

图7

选好模组后,我们点击新增测试设备,每个产品下可以添加最多50个免费的测试设备,我们做DIY程序设计,50个足够我们用了。

图8

新增测试设备时,我们要输入设备名称,就叫D001吧,超子喜欢用这种编号命名设备,大家可以根据喜好自己设置设备名称,然后点击确定就行。

图9

然后会弹出激活凭证,也就是三元组信息,这个是登录阿里云生活物联网平台的认证信息,稍后我们修改51单片机C语言程序时要用到这些重要信息。然后我们点击下一步:人机交互。

图10

和使用STM32单片机做DIY设计时一样,我们使用阿里云生活物联网平台的公版APP,也就是云智能APP。我们打开上图中红圈所示的开关。

图11

然后我们点击未设置,选择一个界面。

图12

自己喜欢哪个,选一个就行,然后点击确认。

图13

然后页面下方,我们要配置APP功能,同STM32单片机DIY时一样,我们主要设置多语言管理,填写品牌名称,设备名称,产品编号等等,大家根据喜好自己填一个就。最下方我们看到了天猫精灵,插座是天猫精灵支持的品类,所以可以直接绑定天猫精灵的账号,用天猫精灵控制开关,非常方便。然后我们点击下一步:批量投产。

图14

我们勾选上充分了解的对勾,然后点击开发完成,到此我们整个项目的配置就算完成了,就下来我们要修改51单片机的程序了。

图15

首先看esp8266.c源文件,wifi_mode变量用于设置使用哪种方式进行配网,大家根据注释自行选择就行,如果选择0的话,SSID和密码要在esp8266.h头文件中设置。

图16

然后我们需要修改mqtt.h头文件中的6个字符串,最麻烦的就是第3个,也就是MQTT协议中CONNECT报文中的包含的密码信息。我们一个一个来,讲一下怎么修改。

我们先看第6个需要修改的字符串,服务器的域名,格式如下所示:

*.iot-as-mqtt.cn-shanghai.aliyuncs.com

我们把*号替换成我们自己设备的ProductKey,这个ProductKey就是我们新建设备时弹出的3元组信息,图9所示,以我新建的设备作为例子,我们修改一下,最终结果如下:

a1jWDQfzbVB.iot-as-mqtt.cn-shanghai.aliyuncs.com

然后看第4和第5个字符串, 都是Topic主题,第4个set是用来接收控制开关命令推送的Topic,我们需要订阅它,第5个post是用来往服务器上传数据的,这次的实验post不是关键点。那么这两个Topic再那找呢?看下图。

图17

测试设备点击红圈圈中的查看。

图18

然后在Topic列表下,可以看到post和set,根据自己设备的实际内容,修改程序中第4和第5个字符串即可。

接下来看第1个字符串,也就是MQTT协议中CONNECT报文中包含的客户端ID信息,格式如下:

*|securemode=3,signmethod=hmacsha1|

其中*号是设备名称,以我的设备为例,修改一下,结果如下:

D001|securemode=3,signmethod=hmacsha1|

然后再看第2个字符串,也就是MQTT协议中CONNECT报文中包含的用户名信息,格式如下:

*&#

其中*号是设备名称 ,#号是ProductKey,都是图9中的三元组信息,就以我的设备为例,修改一下,结果如下:

D001&a1jWDQfzbVB

最后再看最麻烦的第3个字符串,也就是MQTT协议中CONNECT报文中包含的密码信息,需要经过一步加密,我们先要构建待加密的明文字符串,格式如下:

clientId*deviceName*productKey#

其中*号是设备名称 ,#号是ProductKey,以我的设备为例,修改一下,结果如下:

clientIdD001deviceNameD001productKey a1jWDQfzbVB

加密用的秘钥是图9中,三元组信息里的DeviceSecret,我们网上找一个加密算法的网站。

图19

我们复制待加密的字符串和密钥的时候,一定要多检查,不要多空格,不要多回车,错一点加密后的结果都不会正确的,所以大家一定要小心。加密后的结果就是第3个字符串的内容,到此6个需要修改的字符串我们都修改完毕了,重新编译程序,下载到开发板就行了。然后我们再回到阿里云生活物联网平台。

图20

我们进入第3步,人机交互设置页面,我们点击红圈所示的内容,然后弹出页面,需要我们填写设备名称,以我的为例,填上D001,然后就可以生成我们需要的,添加设备的二维码,因为文章中不能出现二维码,所以超子就不展示了。到此我们本次51单片机的DIY程序设计,基本就完成了。

大家如果有什么想做的,或者有什么想法,都可以评论区留言告诉超子哦~~~

想要程序的小伙伴,可以举手哦~~~

相关问答

单片机 串口怎么 接收 长短不一的 字符串 ?

单片机串口接收长短不一的字符串需要使用缓存数组来存储接收到的数据,当接收到数据后判断是否达到预定的长度或者接收到结束符(如“\0”),若未达到则继续接收...

STC 单片机 串口调试,我用 单片机 给计算机发送 字符串 ,但串口助...

3条回答:【推荐答案】是完全没有显示还是显示的内容不对

单片机 代码中num代表什么意思?

Num在单片机代码中是一种数据类型,它表示一个可以表示数字的变量。Num是一种数字变量,它可以表示正数、负数或零。它可以表示一个整数,也可以表示一个浮点数,...

c语言怎么声明一个 字符串 变量?

使用字符数组来实现不过要预留一个位置给'\0',C中的字符串以'\0'结束。举例声明:charch[21]="Iamhappy";没...

uint什么意思,怎么用。 单片机 c语言编程?

1、这不是C语言关键字,只是程序设计者为了方便自己做的宏定义“#DEFINEUINTUNSIGNEDINT”,当然可以把它写成其他的字符串,不过还是用这个好,大部分的程序...

单片机 题目一套7.中断查询确认后,在下列各种8031 单片机 运...

[最佳回答]7.中断查询确认后,在下列各种8031单片机运行情况中,能立即进行响应的是:(D)A.当前正在执行高优先级中断处理B.当前正在执行RETI指令C.当前指令...

keil c中如何将整型转化为 字符串 - mUq30AFL7 的回答 - 懂得

你是要把数字转换成字符串吧、charch[3];inti=345;ch[0]=i/100+48;//取百位ch[1]=(i/10)%10+48;//取十位ch[2]=i%10+48;//取个位就这个思...

keil c中如何将整型转化为 字符串 - 166****7008 的回答 - 懂得

你是要把数字转换成字符串吧、charch[3];inti=345;ch[0]=i/100+48;//取百位ch[1]=(i/10)%10+48;//取十位ch[2]=i%10+48;//取个位就这个思...

跪求回答 深圳捷易测温健康码闸机即插即用,测温健康码闸机...

[回答]嘿嘿俺可以帮助你解决1做一个单片机与触摸屏按键的接口2按一定循序按触摸按键由触摸按键的芯片发出4位BCD码送给单片机3单片机比较接受到的4位BCD码...

单片机 ARR是什么意思?

键字不能用作变量名、函数名等标识符。ANSIC标准C语言共有32个关键字,如:void、char、int、long等,arr并不是C语言的关键字。C语言中标识符是用作程序...AN...

猜你喜欢