前面我们主要介绍了一下红外发射以及接收的代码,也是本此设计的核心。这一篇博客主要对手机app与该模块的一个通信方式,以及main函数的实现方法。
1、数据传输代码通过WiFi与APP进行连接,控制。WiFi模块初始化代码。值得注意的是该配置方案是针对该模块-路由器-手机app实现的,所以该模块用于连接路由器,然后手机通过app找到该设备并进行控制。
#include "usart.h"
//串口1
char Test[]="AT+CWMODE=3\r\n";
char JoinWifi[]="AT+CWJAP=\"wifixdd\",\"xiaojieying\"\r\n";//路由器名以及密码
char TestJoin[]="AT+CWJAP?\r\n";
char SimpleConnect[]="AT+CIPMUX=0\r\n";
//单独为wifi模块写的简易延时
static void delay(int x)
{
int j=10000;
while(x--)
{ j=10000;
while(j--);
}
}
//由于WiFi模块的初始化需要一定的时间,不然无法初始成功,所以必须给一定的延时
void wifi_init(void)
{
//串口1,连接路由器
printf("STAR1 WIFI\n");
puts(Test);delay(3000);
puts(JoinWifi);delay(8000);
puts(TestJoin);puts(Test);delay(3000);
puts(SimpleConnect);delay(3000);
}
usart1初始化函数,主要注意要开接收中断。其他都是基本配置
void uart1_init(u32 bt)
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_USART1|RCC_APB2Periph_AFIO,ENABLE);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//TX
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//RX
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA,&GPIO_InitStructure);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
USART_InitStructure.USART_BaudRate=bt;
USART_InitStructure.USART_WordLength=USART_WordLength_8b;
USART_InitStructure.USART_StopBits=USART_StopBits_1;
USART_InitStructure.USART_Parity=USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
USART_Init(USART1,&USART_InitStructure);
USART_Cmd(USART1, ENABLE);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
USART_ClearFlag(USART1,USART_FLAG_TC);
}
usart1中断执行函数,主要用于对WiFi模块接收到的数据做一个规范化,其中定义了两个参数用于对接收数据的存储和状态标记。
u8 USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
u16 USART_RX_STA=0; //接收状态标记
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != Bit_RESET)
{
Res =USART_ReceiveData(USART1);
//printf("xdd"); //不能加该调试信息,否则会出现不可预知的问题
if(Res=='s')
{
// USART_RX_BUF[USART_RX_STA]=Res ; //USART_RX_BUF????100???
USART_RX_STA=0x01;;
}
else if((USART_RX_STA>0)&&(Res=='e'))
{
USART_RX_BUF[USART_RX_STA-1]='\0';
USART_RX_STA=0;
}
else if((USART_RX_STA>0)&&(USART_RX_STA<=USART_REC_LEN))
{
USART_RX_BUF[USART_RX_STA-1]=Res ; //USART_RX_BUF????100???
USART_RX_STA++;
}
}
}
2、简化版的main函数代码简介
主函数:其中简单写了一个十进制转换函数用于将字符串转化为十进制数形式。在主函数中设计实现红外的模式切换,通过变量hw_date[MAX_DATE]来存储所接收到的红外编码信号,通过NUM用于代表app发送来的键值(0和1被用来作为模式的选择),通过key代表最近一次接收到的红外数据信号。
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "remote.h"
#include "timer.h"
#define MAX_DATE 100
void TIM2_PWM_Init(u16 arr,u16 psc);
extern void wifi_init(void);
u32 hw_date[MAX_DATE]; //用于存储所接收到的红外编码信号
int NUM=0; //串口发送来的十进制数,用于代表app的键值
int ten(u8 *str)
{
int date=0;
while(*str!='\0')
{
if(date>0)
date=date*10;
date+=(int)(*str-'0');
str++;
}
return date;
}
int main(void)
{
u32 key=0;
u8 t=0; //模式选择
delay_init(); //延时函数初始化
// NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
uart1_init(115200); //串口初始化为115200
// LED_Init(); //LED端口初始化
wifi_init();
// LCD_Init();
// KEY_Init();
Remote_Init(); //红外接收初始化
printf("startxx\n");
TIM3_Int_Init(947,0);//RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);B5
printf("start\n");
while(1)
{
NUM=ten(USART_RX_BUF); //接收到的字符串转为数字
//key=16738455;
//printf("USART_RX_BUF=%s ",USART_RX_BUF);delay_ms(300);
//printf("NUM=%d ",NUM);
if(NUM==0) t=0; //学习模式
if(NUM==1) t=1; //红外发送模式
if(t==1) //红外发送模式
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //红外发射
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,DISABLE); //红外捕获
printf("put:key=%d\n",hw_date[NUM]);printf("NUM=%d",NUM);
hw_fs(hw_date[NUM]);
delay_ms(1000);
}
else if(t==0) //学习模式
{
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, DISABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
key=Remote_Scan();
if(key>0)
{
printf("get:key=%d\n",key);printf("NUM=%d",NUM);
hw_date[NUM]=key;
}
}
}
}
此代码块仅完成了初始设想的部分内容,但已具备初步开发成效。并且该设计方案可扩展性极强,在后续我们会适当补充。
3、手机app的大概UI设计 如图(暂时设定,以后更新可增加),其中包括两个模式选择按键,以及一系列的普通控制按键,页面可根据客户需求自动增加。同时还包含了环境显示。
值得关注的是对于手机app的设计,要使其快速自动智能的连接到模块,降低使用者技能要求。
此设计方案已成功实现,欢迎读者提问咨询。如果读者有意愿完成欢迎与我交流探讨并改进。
注:代码设计仅用于学习交流使用。欢迎读者转发,这会是对我最大的鼓励。该程序部分借用正点原子的最初工程文件。
具体代码实现文件都已上传到我的个人主页://download.csdn.net/download/weixin_44313435/12245065