【 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]