lvxinn2006 发表于 2019-5-21 21:27

【 STM32WB55 测评】_04_WEB控制实验

<div class='showpostmsg'> 本帖最后由 lvxinn2006 于 2019-5-21 21:30 编辑

本次活动测评开发板STM32WB55 Nucleo Pack由ST意法半导体提供,感谢意法半导体对EEWorld测评的支持!https://www.stmcu.com.cn/Product/pro_detail/cat_code/STM32WB/family/81/sub_family/252/sub_child_family/0/layout/product
【实验目的】· 熟悉如何使用STM32Cube提供的示例程序;· 熟悉如何使用STM32WB55的串口通信功能。
【实验环境】· NUCLEO-WB55 Nucleo Pack开发板· Keil MDK-ARM(Keil uVision 5.25.2.0)· Keil.STM32WBxx_DFP.1.0.0.pack
【实验资料】· NUCLEO-WB55 Nucleo Pack开发板原理图· STM32WB55xx Data Sheets· STM32WB55xx Reference manual(参考手册)
【实验分析】本示例主要使用NUCLEO-WB55的串口通信功能,并且配合Python实验远程控制USB Dongle上的灯亮灭的功能。本文从简单实用的角度,直接使用HAL库实现应用的开发。1. 硬件设计下图是STlink的虚拟串口与芯片之间的连接原理图,可以知道串口使用了单片机的PB6和PB7。
在STM32WB55中,有两组串口模块:LPUART和USART,通过查询手册STM32WB55xx Data Sheets,可知这两个引脚对应着USART1功能模块,如下图所示:
2. 软件设计这里使用官方示例代码中的STM32Cube_FW_WB_V1.0.0\Projects\NUCLEO-WB55.Nucleo\Applications\BLE\BLE_p2pServer项目,在这个项目的基础上进行功能的添加以及修改。在main函数中,添加代码:
MX_USART1_UART_Init();


该代码作用是初始化串口,把main函数里的任务主循环修改为如下代码:while(1)

{



if (HAL_UART_Receive_IT(&huart1, &ch, 1) == HAL_OK){

protocol_decode(ch, cmd_run);    //作为通信协议数据进行解析

}

SCH_Run(~0);

    /* USER CODE END WHILE */

}


设计串口通信协议如下:数据格式表
bufbufbufbufbufsend_buf
数据包头设备号数据类型数据长度数据校验
0xAAdev_notype_datalengthdataCrc16校验
1byte1byte1byte1bytelength bytes2bytes
数据包头:家庭网关向M0发送数据包头为0xAA设备号: 为M0设备号(房间号)数据类型:0x02 控制数据(命令数据)数据长度:为数据域的字节数校验:crc16校验位    数据对应命令
命令动作
0x30LED_ON(开灯)
0x31LED_OFF(关灯)
0x32Fan_ON(开风扇)
0x33Fan_OFF(关风扇)
0x34Nixietube_ON(开数码管)
0x35Nixietube _OFF(关数码管)
0x36BEEP_ON(开蜂鸣器)
0x37BEEP_OFF(关蜂鸣器



在main函数前,添加如下函数的定义:
/* USER CODE BEGIN 0 */

/* 解析控制协议函数 */

int protocol_decode(int ch, void (*cmd_proc)(unsigned char *, int))

{

    static unsigned char buf;

    static int index = 0;    //记录缓冲区数组下标



    if ((index == 0) && (ch == 0xAA)){//判断数据包头

      buf = ch;

    }else if (index > 0){ //已经收到数据头

      if (index < 4){    //接收数据信息字段

            buf = ch;

      }else if ((index < buf + 6) && (index < 20)){    //校验位

            buf = ch;

            if (index == buf + 6){//接收到最后一个数据

                if (!cmd_proc) return -1;

                cmd_proc(buf+4, buf); //根据命令代码,执行相应动作

                index = 0;    //index归零表示重新接收新数据

                return 1;

            }

      }else{    //无效数据包,丢弃

            index = 0;

            return -2;

      }

    }

    return 0;

}

#include "ble_types.h"

#include "uuid.h"

#include "p2p_stm.h"



/* 执行命令的函数 */

void cmd_run(unsigned char *src, int len)

{

    uint8_t data = {0x01, 0x00};

    switch(src){

      case 0x30:

            data = 0x01;

      break;

      case 0x31:

            data = 0x00;

      break;

    }      //P2P_Server_App_Context.ButtonControl.ButtonStatus=data;

    P2PS_STM_App_Update_Char(P2P_NOTIFY_CHAR_UUID, data);

    HAL_UART_Transmit(&huart1, data, 2, 1000);

}

/* USER CODE END 0 */


【实验现象】· · 使用串口调试助手测试串口通信,按照设计的通信协议,模拟控制数据的发送: 可以看到USB Dongle端的LED灯在两种不同状态下切换状态。这里使用了自己用Python开发的物联网网关服务,主要原理如下图所示; 打开网关服务:

网关运行起来效果如上图所示,此时打开浏览器,并访问:http://127.0.0.1

点击远程控制,在右侧能看到几个控制按钮,点击控制按钮时,可以看到页面上按钮的状态会有所变化:
· 每点击一次Led灯按钮后,可以看到USB Dongle端LED的状态变化。





</div><script>                                        var loginstr = '<div class="locked">查看本帖全部内容,请<a href="javascript:;"   style="color:#e60000" class="loginf">登录</a>或者<a href="https://bbs.eeworld.com.cn/member.php?mod=register_eeworld.php&action=wechat" style="color:#e60000" target="_blank">注册</a></div>';
                                       
                                        if(parseInt(discuz_uid)==0){
                                                                                                (function($){
                                                        var postHeight = getTextHeight(400);
                                                        $(".showpostmsg").html($(".showpostmsg").html());
                                                        $(".showpostmsg").after(loginstr);
                                                        $(".showpostmsg").css({height:postHeight,overflow:"hidden"});
                                                })(jQuery);
                                        }                </script><script type="text/javascript">(function(d,c){var a=d.createElement("script"),m=d.getElementsByTagName("script"),eewurl="//counter.eeworld.com.cn/pv/count/";a.src=eewurl+c;m.parentNode.insertBefore(a,m)})(document,523)</script>
页: [1]
查看完整版本: 【 STM32WB55 测评】_04_WEB控制实验