这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » STM32 » STM32L053与Yeelink物联网平台传送接收数据

共22条 1/3 1 2 3 跳转至

STM32L053与Yeelink物联网平台传送接收数据

菜鸟
2015-12-31 10:10:59     打赏
STM32L053使用进程贴

很荣幸获得最后一批申请者的试用资格,最近工作比较忙,在收到板卡玩了几天之后就没仔细看了,今天开贴写出我的试用过程:

1. 实现STM32L053串口DMA接收不定长数据的功能

2. 详细介绍Yeelink物联网免费开发平台

3. 实现手机可以通过Yeelink远程获取到STM32L053的传感器数据以及实现控制

4. STM32L053MSP430功耗对比

串口一直是一个MCU比较重要的部分,以前用STM32F1结合3.5的标准外设库开发起开觉得也很方便,可以很快上手,在ST推出HAL库之后,初次感觉比之前的库好复杂,其实主要还是教程少,不过看官方技术人员介绍HAL库以后是趋势,HAL很大的一个优点就是通用性好,在不同系列之间移植比较方便。串口发送数据简单,这里不多说,主要说下接收部分:

串口通讯一般有3中方式比较常用,轮询、中断和DMA,轮询方式为堵塞模式,在规定的时间内接收到指定的长度才行,这种用的比较少;中断模式为非堵塞模式,在接到数据进入中断就存入相应的缓冲区,可以设置相应的开始结束帧来判断数据的正确性,但在接收不定长数据的时候还要加多一个定时器来判断数据接收完成,在标准库还好,在HAL库中在每次接收完还要重新开启接收中断,还要指定长度,没有收到指定长度就一直等待,这样在接收不定长数据就不好处理;最后说下用DMA实现的方式,STM32有一个串口中断叫空闲中断,就是收到一帧数据结束后才进入空闲中断,配合串口DMA通道,可以将串口的接收特别是在数据很多的时候效果非常好。下面详细介绍

STM32Cube的介绍就不多说了,大家已经介绍很多了

1. 进入Pinout界面,选择为异步通讯方式


2. 时钟配置界面,这个感觉是最好的,完完全全让大家领悟的L053的时钟树,这里选择HIS RC,主频设为最高32MHz


3. 进入串口配置界面,首先是基本设置

4. 然后是开启串口DMA

5. 然后开启中断

6. 最后配置中断优先级

7. 然后配置工程设置

建议每个外设生成独立的源文件和头文件,自己看的也舒心,也方便管理

自动配置的就这么多了,下面打开自动生成的工程

有一点大家首先要注意,就是自己添加的代码一定要在USER CODE BEGINUSER CODE END之间在重新更行工程之后才不会被删掉,首先定义变量,定义了接收缓冲大小,接收到数据的长度,一帧数据接收完标志,缓冲。

初始化代码都自动做好了,然后开启串口空闲中断,这里不要再开启串口其它串口中断了,

然后在主循环中在接收完标志位置位后,将接收到的数据原本的发送回去,重新开启下一次串口DMA接收

下面在中断函数中写入下面代码

主要是在串口发完一帧数据之后就进入这个中断函数,是发完一帧才会进入一次哦,是不是比直接用中断频繁进入效率高很多,在判断空闲中断标志位置位后,清楚中断标志,停止DMA,读出还有多少没传完,然后总长度减去没传完的就是本次接收的数据长度,然后置位接收完成标志位,等待在主函数中进行处理。这样,就可以接收任意长度的数据了,而且效率极高,在中断完之后,数据已经在缓冲区了,只要在主循环中查出此次接收到多长的数据帧就可以进行相应的处理了,个人感觉这是串口接收的最好方式,今天就先写这么多。




关键词: 串口     DMA     Yeelink     STM32L053         

助工
2015-12-31 10:20:08     打赏
2楼
第一个物联网相关的帖子,楼主V5,继续加油,等你更新

工程师
2015-12-31 11:18:33     打赏
3楼
好熟悉的代码。。。。。多谢分享

菜鸟
2016-01-05 17:32:56     打赏
4楼

好,继续开更,这次介绍Yeelink物联网开发平台。

Yeelink网址:http://www.yeelink.net/

1.    Yeelink是一个新型开放的网络服务器,为用户免费提供网络数据的上传、保存以及查询。支持多种数据格式,在按照要求传入之后,就会将数据保存在服务器的后台,用户可以随时查看。对于硬件工程师来说,大部分时间都在在开发底层驱动,对软件APP以及服务器的开发一知半解,特别是在后期的各种安全措施上问题很多。在Yeelink上,数据的存储安全可靠,而且免费提供一个安卓和IOS的简易APP框架,只要在简单修改之后便可使用。这样使硬件制作者可以在不关心服务器实现细节和运维的情况下,有独立设计电子产品的能力Yeelink拥有非常先进的服务器存储解决方案,能够接受很多传感器的同时接入以及存储,而且能够确保用户的数据不会丢失,数据的共享范围由用户确定。Yeelink提供两种不同的方法进行数据交互,一种是通过POST上传数据给YeelinkYeelink会自动提取我们上传的数据,里面包括自己的身份特征,会自动存储到自己的空间。另一种是通过GET请求不断查询变量的状态。本次我们在开关中要求速度较快,使用第二种方法,其它的传感器使用第一种方法。

2.    数据要上传上去必须要用WiFi模块了这里使用有人的USR-WIFI-232-S,USR-WIFI-232-S模块有2TCP Socket:通过串口向wifi模组写入数据时会转发到Socket端口进行发送,同理当服务器向wifi模组发送数据时也是通过串口发送给微控制器。SocketA的工作方式有4种:分别是:TCP ServeTCP ClientUDP ServeUDP Client,当Socket A设置成TCP Serve时,可支持最多5TCP ClientTCP链路连接。在开始时使用TCP Serve,用控制器发送指令去配置wifi模块的相关信息,之后选择TCP Client去连接Yeelink服务器。


3.    简单介绍下Http协议和Json格式

                   Http基本协议:包括三个部分,请求行(request line,头部键值对(header key-value,请求体,                             其中在GET/PUT请求体是可以选择的。

                   简单的GET请求:

                           GET /v1.1/device/9290/sensor/14641/datapoints HTTP/1.1\r\n

                           Host: api.yeelink.net\r\n

                           Content-Length: 0\r\n

                           U-ApiKey: da5bc4289a3298c59099ac1e1001c2f5\r\n

                           \r\n

                           简单的POST请求

            POST /v1.1/device/9290/sensor/14641/datapoints HTTP/1.1\r\n

            Host: api.yeelink.net\r\n

            Content-Length: 14\r\n

            U-ApiKey: da5bc4289a3298c59099ac1e1001c2f5\r\n

            \r\n

            {“value”:30}

                  请求行

         POST /v1.1/device/9290/sensor/14641/datapoints HTTP/1.1\r\n

            格式为

                   $method $url HTTP/1.1\r\n

                   其中:$method是请求方法,可以是GETPOSTPUTDELETE等,$url是请求路径,HTTP/1.1是                              固定字符,为http协议的版本,\r\n换行,标记请求行的结束。

                   头部键值对

           Host: api.yeelink.net\r\n

           Content-Length: 14\r\n

            \r\n

            格式为:

            $key: $value\r\n

                           其中:$key是键,例如Host代表主机的键,Content-Length代表请求体长度的键,$value是值,例如                            主机名api.yeelink.net\r\n换行,代表一个header的结束,这里最后一个空行为header的结束标                                志,不能没有。

                   请求体

           {“value”:30}

           约束:请求体可以是字符串、数字、图片、压缩包等,http协议本身没有限制具体的格式。但是无规            矩不成方圆,在Yeelink有一套自己的数据格式,上传的值Yeelink会在刚上传上去时自动提取。        

4.下面介绍Yeelink开发步骤:

         首先要注册账号,然后登陆用户中心

          

          然后添加新设备

          


           创建自己的设备

              

            

            

              根据自己喜欢的添加自己想要的传感器类型,有数据行,开关型,GPS型,图片型等

               

          

               添加玩就是这样

                

               最后的界面就是这样

                

                  打马赛克的是自己的传感器ID数据,要保密

                  最后先提前放一张测试的图片

                    

                    好了,今天先介绍这么多,过几天介绍用STM32L053的上传数据的程序代码


菜鸟
2016-01-05 17:33:30     打赏
5楼
排版的不是很好,见笑了。。。

院士
2016-01-05 19:26:14     打赏
6楼

楼主 设计的真棒。

其中串口的不定长接收中断,目前并没有太好的办法,但是楼主的方案算是一个很好的办法了。


高工
2016-01-05 20:52:11     打赏
7楼

真不赖,,

就是图点击不能放大,字体小啊


助工
2016-01-06 09:13:03     打赏
8楼
楼主的认真让我感到十分欣慰呀,楼主继续加油,看好你!

菜鸟
2016-01-07 15:33:59     打赏
9楼

继续开更,当大家配置完Yeelink的传感器之后,就可以把自己的数据上传到Yeelink服务器上了,在一开始就写了串口的DMA接收不定长数据也是为现在做准备,一般有2中情况,把自己传感器的数据上传到Yeelink服务器,或者查询服务器中自己定义开关的状态,下面分别介绍:

1.  传自己传感器的数据到Yeelink服务器

方法也比较简单,数据行的数值方法如下,通过串口发送数据到WiFi模块(WiFi模块此时应该已经连接到Yeelink服务器,这里补充下,YeelinkIP42.96.164.52,端口号:80WiFi模块配置为STA模式,连接上WiFi之后主动与Yeelink服务器建立TCP连接),具体格式如下(在Yeelink中都可以找到相关API文档):

    tem = (uint8_t)DS18B20_Get_Temp();        //得到温度数据
    printf("POST /v1.0/device/9295/sensor/45823/datapoints HTTP/1.1\r\n");
    printf("Host: api.yeelink.net\r\n");
    printf("Accept: */*\r\n");
    printf("U-ApiKey: da5bc4289a3298c59758966541c2f5\r\n");
    printf("Content-Length:14\r\n");
    printf("Content-Type: application/x-www-form-urlencoded\r\n");
    printf("Connection: close\r\n");
    printf("\r\n");
    printf("\"value\":");
    printf("%d\n", tem);
    printf("}\r\n");

2.       查询Yeelink中传感器的数值,比如WiFi插座,在手机端改变了插座开关值的时候,可以通过定时查询的方式改变插座实际的开关状态,格式如下

          printf("GET /v1.0/device/9256/sensor/14459/datapoints HTTP/1.1\r\n");
          printf("Host: api.yeelink.net\r\n");
          printf("Accept: */*\r\n");
          printf("U-ApiKey: da5bc42547896529ac1e1001c2f5\r\n");
          printf("Content-Length: 0\r\n");
          printf("Connection: close\r\n");
          printf("\r\n");

        发完这一帧数据之后,Yeelink服务器会返回一帧数据,只需要在接到}之后判断前一位的值是0还是1就可以对继电器做出开关状态。具体在我们的程序中,在DMA接收完成之后,只需要判断第(len-1)的数据值就可以知道开关的状态。

   if(Res=='}')
   {
      if(USART_RX_BUF[len-1] == '1')
          LED0 = 0;
      else if(USART_RX_BUF[len-1] == '0')
          LED0 = 1;

   }

      这是调试时候的串口界面

       

       下面放一些收的APP上一段时间的数据

      温度

        

      湿度

       

       PM2.5

       

       开关界面

       


         随着互联网技术的进步,微信出现在人们的生活中,人人手机几乎必备,所以用微信控制必不可少,Yeelink有公众账号,只需要关注之后便可控制,对于开关型传感器,可以查看开关的当前         状态并控制它的开启与关闭;对于数值型传感器,可以实时获取传感器最新的数据信息,对于GPS传感器,可以以图文并茂的形式查看最新位置信息;对于图像传感器,可以的在安卓设备上浏         览拍摄的照片。下面是微信的具体截图:

         


        Yeelink还有一个非常棒的功能,就是微博报警,在自己的传感器上设置好阀值之后,超过定义的数值就会微博上自动报警,还可以自定义内容

        首先需要编辑设备播报的内容

         

         之后在传感器中编辑并绑定自己的新浪微博账号,当超出定制的范围之后,便会通过微博播报

         

           下面是微博播报的内容:

          


          

           


       好了,就介绍这些先,只是简单的介绍了下,Yeelink论坛有更具体的Arduino平台的介绍方法,相信大家都可以玩出更多的花样,大家有什么要交流的欢迎在下面提问,我会知无不言,谢谢大家!








菜鸟
2016-01-07 15:34:40     打赏
10楼
不小心爆照了

共22条 1/3 1 2 3 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]