(一)手机端android app代码
Android app 代码如下:
Android手机appTCP通信
(二) 单片机STM32单片机主程序代码
//代码共计79行
//日期:2020.2.22
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "stm32f10x.h"
#include "wifi_modul.h"
#include "tim_3.h"
#include "stdlib.h"
#include "string.h"
#define WIFI_HOT ""CMCC-bqb6","qywkaaf7""
//¶¨Òå·ÓÉÆ÷Èȵ㣬TCP·þÎñÆ÷¶Ë¿Ú£¬ESP8266mode
u8 * wifi_hot=(u8*)WIFI_HOT;
u8 RX_cnt=0,tim1s_flag=0;
u8 hardware_init()
{
u8 set_succflg=0;
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃÖжÏǶÌ×ÏòÁ¿
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
TIM3_Int_Init(9999,7199); //TIM3¼Æʱ1s
KEY_Init();
uart3_init(115200);
uart1_init(115200);
wifi_modul_init();
set_succflg=esp8266_AT_init(wifi_hot); //ESP8266³õʼ»¯£¬Á¬½Ó·ÓÉÆ÷£¬²¢¿ªÆôAPģʽ
return set_succflg;
}
int main(void)
{
u8 connect_flag;
hardware_init();
while(1)
{
if(USART3_RX_STA==0){
if(!mystrcmp(USART3_RX_BUF,(u8 *)"+IPD")){ //Ô¶³Ì¶Ë·¢À´µÄÏûÏ¢ÑéÖ¤Ö¡Í·ÊÇ·ñÕýÈ·£¬ÕýÈ·×°ÈëCMDÊý×é
copy_string(USART3_RX_CMD_BUF[cmd_cnt++],USART3_RX_BUF,(USART3_RX_CMD_STA&0x3fff)); //½âÎöÊÇÃüÁÔò×°ÈëÃüÁîÊý×é
if(cmd_cnt){
cmd_cnt--;
switch(cmd_Resolve(USART3_RX_CMD_BUF[cmd_cnt])) //ÃüÁî´¦Àíº¯Êý
{
case '0':
LED1=1;
LED0=1;
break;
case '1':
LED1=0;
LED0=0;
break;
default: //Ö¡½âÎö´íÎó
break;
}
}
USART3_RX_BUF[0]='X';
}
if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT")) //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó´ò¿ªÏûÏ¢
connect_flag=1;
if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT FAIL")) //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó¶Ï¿ªÏûÏ¢
connect_flag=0;
}
if((tim1s_flag>1)&&(connect_flag==1)){ //Èç¹ûIPÁ¬½ÓÕýÈ·£¬¶¨Ê±Ò²µ½´ï·¢ËÍSTM32ζÈ
send_STM32Temp();
tim1s_flag=0;
}
delay_ms(50);
}
}
void TIM3_IRQHandler(void) //TIM3¶¨Ê±ÖжÏ
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éTIM3¸üÐÂÖжϷ¢ÉúÓë·ñ
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMx¸üÐÂÖжϱêÖ¾
tim1s_flag+=1;
}
}
(三)项目总结与结果展示:
- 关于switch case 结构,要注意switch的函数对象是数值,不是字符。
- 代码一定要注意格式,开始不注意格式,后来一个小问题找了半天才找到,尤其是段if嵌套。
- Android 程序不能在main Thread 里进行等待太长时间的操作,一定要放到子线程里,如需刷新主线程的页面,子线程必须调用handler配合Message来实现。
- 项目实际使用的话最好用内网穿透,使用花生壳申请一个公网IP,登录路由器设置IP地址绑定设备序列号(防止路由器断电自动分配IP),设置内网穿透的对象的IP地址和端口号。这样在手机端就可以用任何网络控制STM32了。
结果:
- 手机端远程控制开发板LED
- 开发板每隔2秒上报给手机app一个温度数据
- 整个框架实现了互相通信,其他的功能就没必要浪费时间做了,往里加就好。
(一)手机端android app代码
Android app 代码如下:
Android手机appTCP通信
(二) 单片机STM32单片机主程序代码
//代码共计79行
//日期:2020.2.22
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "stm32f10x.h"
#include "wifi_modul.h"
#include "tim_3.h"
#include "stdlib.h"
#include "string.h"
#define WIFI_HOT ""CMCC-bqb6","qywkaaf7""
//¶¨Òå·ÓÉÆ÷Èȵ㣬TCP·þÎñÆ÷¶Ë¿Ú£¬ESP8266mode
u8 * wifi_hot=(u8*)WIFI_HOT;
u8 RX_cnt=0,tim1s_flag=0;
u8 hardware_init()
{
u8 set_succflg=0;
delay_init(); //ÑÓʱº¯Êý³õʼ»¯
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //ÉèÖÃÖжÏǶÌ×ÏòÁ¿
LED_Init(); //³õʼ»¯ÓëLEDÁ¬½ÓµÄÓ²¼þ½Ó¿Ú
TIM3_Int_Init(9999,7199); //TIM3¼Æʱ1s
KEY_Init();
uart3_init(115200);
uart1_init(115200);
wifi_modul_init();
set_succflg=esp8266_AT_init(wifi_hot); //ESP8266³õʼ»¯£¬Á¬½Ó·ÓÉÆ÷£¬²¢¿ªÆôAPģʽ
return set_succflg;
}
int main(void)
{
u8 connect_flag;
hardware_init();
while(1)
{
if(USART3_RX_STA==0){
if(!mystrcmp(USART3_RX_BUF,(u8 *)"+IPD")){ //Ô¶³Ì¶Ë·¢À´µÄÏûÏ¢ÑéÖ¤Ö¡Í·ÊÇ·ñÕýÈ·£¬ÕýÈ·×°ÈëCMDÊý×é
copy_string(USART3_RX_CMD_BUF[cmd_cnt++],USART3_RX_BUF,(USART3_RX_CMD_STA&0x3fff)); //½âÎöÊÇÃüÁÔò×°ÈëÃüÁîÊý×é
if(cmd_cnt){
cmd_cnt--;
switch(cmd_Resolve(USART3_RX_CMD_BUF[cmd_cnt])) //ÃüÁî´¦Àíº¯Êý
{
case '0':
LED1=1;
LED0=1;
break;
case '1':
LED1=0;
LED0=0;
break;
default: //Ö¡½âÎö´íÎó
break;
}
}
USART3_RX_BUF[0]='X';
}
if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT")) //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó´ò¿ªÏûÏ¢
connect_flag=1;
if(!mystrcmp(USART3_RX_BUF,(u8 *)"0,CONNECT FAIL")) //ÊÕµ½Ô¶³ÌµÄIPÁ¬½Ó¶Ï¿ªÏûÏ¢
connect_flag=0;
}
if((tim1s_flag>1)&&(connect_flag==1)){ //Èç¹ûIPÁ¬½ÓÕýÈ·£¬¶¨Ê±Ò²µ½´ï·¢ËÍSTM32ζÈ
send_STM32Temp();
tim1s_flag=0;
}
delay_ms(50);
}
}
void TIM3_IRQHandler(void) //TIM3¶¨Ê±ÖжÏ
{
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //¼ì²éTIM3¸üÐÂÖжϷ¢ÉúÓë·ñ
{
TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //Çå³ýTIMx¸üÐÂÖжϱêÖ¾
tim1s_flag+=1;
}
}
(三)项目总结与结果展示:
- 关于switch case 结构,要注意switch的函数对象是数值,不是字符。
- 代码一定要注意格式,开始不注意格式,后来一个小问题找了半天才找到,尤其是段if嵌套。
- Android 程序不能在main Thread 里进行等待太长时间的操作,一定要放到子线程里,如需刷新主线程的页面,子线程必须调用handler配合Message来实现。
- 项目实际使用的话最好用内网穿透,使用花生壳申请一个公网IP,登录路由器设置IP地址绑定设备序列号(防止路由器断电自动分配IP),设置内网穿透的对象的IP地址和端口号。这样在手机端就可以用任何网络控制STM32了。
结果:
- 手机端远程控制开发板LED
- 开发板每隔2秒上报给手机app一个温度数据
- 整个框架实现了互相通信,其他的功能就没必要浪费时间做了,往里加就好。
举报