完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
宠物屋的源代码这里分析的是STM32底板的V2.3版本。可以在本帖直接下载附件。
硬件原理图什么的,就请大家去自行搜索下载吧。下载的时候注意看自己板子的版本号,下载对应的原理图。 像代码中那些HAL库,我就不分析了,硬件不一样的HAL库中的函数需要改几个引脚号。 有兴趣的可以自己写这些HAL,等自己添加了外设的时候,要写自己的外设的HAL添加到工程中。 这里主要分析让人头疼的Protocol。 顺便分析程序的运行流程。 这个程序还是有几个小bug的,而且操作都是用的全局变量、全局数据结构体。 加之一些memcpy、memcmp等函数,各种报文的结构体,把大伙吓到了。【也许只是把我这种菜鸡吓到了。。】 试着捋一捋就能捋顺了。 大家多用"Ctrl+F中的MarkAll",和"在整个工程中搜索"来看代码。那只笔写写画画。 |
|
相关推荐
|
|
推荐大家先搞清楚两个全局变量的意思,他们分别作为标志位:
uint8_t p0Flag = 0; //WiFi控制设备命令,已经下达的标志 重发机制结构体 uint32_t SendTime; //重发时记录的时间戳 uint8_t SendNum; //重发次数 uint8_t Flag; //1、作为需要等待WiFi应答的标志!!!!! //2、这个标志位也限制MCU上报数据!!!!! // 只要此标志置位,暂停上报 // 复位标志,则重新允许上报 uint16_t ResendBufLen; //长度 uint8_t Cmd_Buff[Max_UartBuf]; //重发数据缓冲区 Pro_Wait_AckTypeDef Wait_AckStruct; 还有两个全局结构体: WirteTypeDef_t WirteTypeDef; //WiFi写来的数据 ReadTypeDef_t ReadTypeDef; //WiFi读走的数据 这些个搞清楚了,再看代码就不乱了。 |
|
|
|
|
|
再来说说协议:
MCU回复WiFi模组要用的 通用协议帧: 4.2 WiFi模组与设备MCU的心跳 4.5 WiFi模组向MCU汇报工作状态 4.6 WiFi模组请求重启MCU 4.7 WiFi模组通知MCU得到非法消息 4.10 WiFi模组控制更改MCU状态 都用通用协议帧来回复 然而 4.1 WiFi请求MCU系统信息,MCU要回复系统信息 4.3 MCU通知WiFi进入配网,WiFi发Ack 4.4 MCU通知WiFi重启,WiFi发Ack 4.8 WiFi读取MCU状态,MCU回复中要有设备信息和ActionBit位 4.9 MCU主动上报,WiFi发应答Ack 是需要WiFi回复MCU的! |
|
|
|
|
|
大致的流畅:
1、按键处理 2、串口信息处理 3、如果接收到WiFi模组控制MCU的命令,则更新MCU状态,并立即上报MCU状态 4、每隔1s,采集一次MCU状态 具体来说明第2条,串口信息处理: u8 GizWits_MessageHandle(u8 * Message_Buf, u8 Length_buf) 这里如果收到的是4.10,WiFi控制MCU的命令,则把命令的数据内容传给Message_Buf 进来之后,抓取一包数据。 当WiFi的应答非法,或没收到WiFi应答时,启动重发机制。但这里是Bug。具体见代码 抓取数据包成功, 判断校验位,校验失败直接扔掉数据帧。 判断收到WiFi模组的Ack信息,是不是正确的Ack 下面是重头戏了,根据收到的命令码进行对应的操作: 其他的略过,只说接收到4.8和4.10时的情况。 |
|
|
|
|
|
//4.8 WiFi读取MCU. Cmd=0x03
//4.10 WiFi控制MCU. Cmd=0x03 case Pro_W2D_P0_Cmd: //就是这里 { switch(UART_HandleStruct.Message_Buf[sizeof(Pro_HeadPartTypeDef)]) //标准报头后紧跟一个action(1B) { //4.10 WiFi控制MCU. Cmd=0x03 ActionBit=0x01 case P0_W2D_Control_Devce_Action: { Pro_W2D_CommonCmdHandle(); //回复通用协议帧 //储存ActionBit之后的信息到Message_Buf,最终传给WriteTypeDef来更改MCU设备状态 memcpy(Message_Buf, UART_HandleStruct.Message_Buf+sizeof(Pro_HeadPartP0CmdTypeDef), Length_buf); p0Flag = 1; //main()里,依靠此标志,和WriteTypeDef来控制更改设备状态 break; } //4.8 WiFi读取MCU. Cmd=0x03 ActionBit=0x02 case P0_W2D_ReadDevStatus_Action: Pro_W2D_ReadDevStatusHandle(); break; default: break; } } break; |
|
|
|
|
|
不想了解以上代码的同学,可以直接忽略什么上边。
下面告诉大家在写自己的智能硬件时,需要在源代码基础之上更改的地方。分别是 Gokit.h中ReadTypeDef 结构WriteTypeDef 结构Main.c中GatherSensorData 函数ControlDeviceHandle 函数对了,别忘了修改代码的ProductKey,在Protocol.h中。每个产品都有属于自己唯一的ProductKey。 其他的都不用动,可复用性还是超高的! |
|
|
|
|
|
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi编写程序
575 浏览 0 评论
《DNK210使用指南 -CanMV版 V1.0》第三十七章 image图像对比实验
554 浏览 0 评论
500 浏览 1 评论
482 浏览 0 评论
关于RT-Thread studio添加freemodbus控件失败的问题
817 浏览 1 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11641 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-8 15:27 , Processed in 0.751457 second(s), Total 86, Slave 66 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号