wifi模块:esp8266-01s

51单片机:STC89C52RC

查询手册以及通过安信可的串口调试可以得到如下示例

连接服务器demo

#include "reg52.h"
#include "intrins.h"
#include "string.h"

sbit led1 = P3^7;
char buf[20]={0};
char mode[] = "AT+CWMODE=3\r\n";
code char lj_net[] = "AT+CWJAP=\"xiaomi_424\",\"424666233\"\r\n";
code char lj_service[] = "AT+CIPSTART=\"TCP\",\"192.168.31.6\",8080\r\n";
char open[]="AT+CIPMODE=1\r\n";
char send[]="AT+CIPSEND\r\n";
char reset[] = "AT+RST\r\n";

char flag=0;
char led_flag=0;
char e_flag=0;
char s_flag=0;

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void uart_init()
{
	//设置SMOD=1
	PCON = 0x10;
	//设置串行通信方式1
	SCON=0x50;
	
	//设置定时器/计数器1定时、工作方式2
	TMOD &=0x0F;
	TMOD |= 0x20;
	//设定定时常数
	TL1=0xFD;
	TH1=0xFD;

	TR1=1;
	ES=1;
}

void sendChar(char c)
{
	SBUF=c;
	while(!TI);
	TI=0;
}

void sendString(char* str)
{
	while(*str){
		sendChar(*str);
		str++;
	}
}

void connect_wifi()
{
	
	sendString(mode);
	while(!flag);
	flag=0;
	
	sendString(lj_net);
	while(!flag);
	flag=0;
	
	sendString(lj_service);
	while(!flag);
	flag=0;
	
	sendString(open);
	while(!flag);
	flag=0;
	
	sendString(send);
	while(!flag);
	flag=0;
	s_flag=1;
}

void main()
{
	EA=1;
	uart_init();
	Delay1000ms();
	
	
	while(1){
		if(s_flag==0){
			connect_wifi();

		}
		sendString("connect success\r\n");
		Delay1000ms();
		if(led_flag){
			led1=!led1;
		}
		
		led_flag=0;
		e_flag=0;
	}
}

void UART_Routine(void) interrupt 4
{
	char tmp;
	
	static char len=0;
	if(RI){
		tmp = SBUF;
		
		if(tmp=='O' || tmp == 'L' || tmp=='E' || len>19){
			len=0;
		}
		buf[len++] = tmp;
		if(buf[0] == 'O' && buf[1]=='K'){
			flag=1;
			memset(buf,'\0',20);
			
		}
		if(buf[0] == 'L' && buf[1] == '1'){
			led_flag=1;
			memset(buf,'\0',20);
		}
		if(buf[0]=='E' && buf[1] == 'R'){
			
			sendString(reset);
			s_flag=0;
			memset(buf,'\0',20);
		}
		RI=0;
	}
}

image.png

esp作为服务器

上电之后,需要按一下复位键,否则可能上电后的invalid会干扰AT+RST的invalid。也可以不复位,那么就需要在uart之后延时一段时间,等待esp初始化完毕

#include "reg52.h"
#include "intrins.h"
#include "string.h"

sbit led1 = P3^7;
char buf[20]={0};
char mode[] = "AT+CWMODE=2\r\n";
char dlj[] = "AT+CIPMUX=1\r\n";

char TCP_Server[] = "AT+CIPSERVER=1\r\n";
/*
这里一定要注意,因为我发送的是hello,所以一定是0,5,如果是0,6那么会错误*/
char send[] = "AT+CIPSEND=0,5\r\n";

char reset[] = "AT+RST\r\n";

char ok_flag=0;
char con_flag=0;
char i_flag=0;

void Delay1000ms()		//@11.0592MHz
{
	unsigned char i, j, k;

	_nop_();
	i = 8;
	j = 1;
	k = 243;
	do
	{
		do
		{
			while (--k);
		} while (--j);
	} while (--i);
}
void uart_init()
{
	//设置SMOD=1
	PCON = 0x10;
	//设置串行通信方式1
	SCON=0x50;
	
	//设置定时器/计数器1定时、工作方式2
	TMOD &=0x0F;
	TMOD |= 0x20;
	//设定定时常数
	TL1=0xFD;
	TH1=0xFD;

	TR1=1;
	ES=1;
}

void sendChar(char c)
{
	SBUF=c;
	while(!TI);
	TI=0;
}

void sendString(char* str)
{
	while(*str){
		sendChar(*str);
		str++;
	}
}

void connect_wifi()
{

	sendString(reset);
	while(!i_flag);
	i_flag=0;
	ok_flag=0;
	
	sendString(mode);
	
	while(!ok_flag);
	ok_flag=0;
	sendString(dlj);
	while(!ok_flag);
	ok_flag=0;
	
	
	sendString(TCP_Server);
	while(!ok_flag);
	
	ok_flag=0;
	
	while(!con_flag);
	con_flag=0;
	
}

void main()
{
	EA=1;
	uart_init();
	Delay1000ms();
	//配置成服务器
	connect_wifi();
	while(1){
		//发送数据
		sendString(send);
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
		
		sendString("hello");
		Delay1000ms();
		Delay1000ms();
		Delay1000ms();
	}
}

void UART_Routine(void) interrupt 4
{
	char tmp;
	
	static char len=0;
	if(RI){
		tmp = SBUF;
		
		if(tmp=='O' || ','==tmp ||'i'==tmp || len>19){
			len=0;
		}
		buf[len++] = tmp;
		if(buf[0] == 'O' && buf[1]=='K'){
			ok_flag=1;
			memset(buf,'\0',20);
		}
		
		if(buf[0]==',' && buf[1]=='C')
		{
			con_flag=1;
			memset(buf,'\0',20);
		}
		
		if(buf[0] == 'i' && buf[1]=='n'&&buf[2] == 'v'){
			i_flag=1;
			memset(buf,'\0',20);
		}
		
		RI=0;
	}
}

stm32:stm32f103c8t6

连接服务器demo



/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"

/* USER CODE END Includes */
/* USER CODE BEGIN PV */
uint16_t UART1_RX_STA;
uint8_t re_buf;
uint8_t buf[1024];

char buf_wifi[20];
char mode[] = "AT+CWMODE=3\r\n";
char lj_net[] = "AT+CWJAP=\"xiaomi_424\",\"424666233\"\r\n";
char lj_service[] = "AT+CIPSTART=\"TCP\",\"192.168.31.112\",8880\r\n";
char open[]="AT+CIPMODE=1\r\n";
char send[]="AT+CIPSEND\r\n";
char reset[] = "AT+RST\r\n";

char AT_OK=0;

char AT_Connect_Net_Flag=0;
/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){
        //判断标志位最高位是否为1
		if((UART1_RX_STA&0x8000) == 0){
            //判断标志位第二位是否为1
			if(UART1_RX_STA & 0x4000){
                //判断是否接收完毕,也就是\n
				if(re_buf==0x0a){
					UART1_RX_STA |= 0x8000;
					if(!strcmp(buf,"OK")){
						AT_OK=1;
					}
					
					if(!strcmp(buf,"led")){
						HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
					}
					
					if(!strcmp((uint8_t *)buf, "FAIL"))
					{
						int i = 0;
						for(i = 0; i < 5; i++)
						{
							HAL_GPIO_TogglePin(GPIOB, GPIO_PIN_8);
							HAL_Delay(1000);
						}
						HAL_GPIO_WritePin(GPIOB, GPIO_PIN_9, GPIO_PIN_RESET);
						printf(reset);
					}
					memset(buf, 0, strlen(buf));
					UART1_RX_STA = 0;
					
				}else {
					UART1_RX_STA=0;
				}
			}else {
                //判断是否接收到了尾部,也就是\r
				if(re_buf == 0x0d){
					UART1_RX_STA |= 0x4000;
				}else {
          //0x3fff=0011 xxxx xxxx xxxx:就是能接收到数据的最多的个数
          //&0x3fff就是防止数据溢出
					buf[UART1_RX_STA&0x3FFF]=re_buf;
					UART1_RX_STA++;
					if(UART1_RX_STA>99){
						UART1_RX_STA=0;
					}
				}
			}
		}
        //中断接收完毕后,会自动关闭中断,所以这里需要重新打开
		HAL_UART_Receive_IT(&huart1,&re_buf,1);
	}
}

void connect_wifi()
{
	
	printf(mode);

	HAL_UART_Transmit(&huart2,mode,strlen(mode),100);
	while(!AT_OK) HAL_Delay(50);
	AT_Connect_Net_Flag=0;
	AT_OK=0;
	
	printf(lj_net);
	HAL_UART_Transmit(&huart2,lj_net,strlen(lj_net),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;
	
	printf(lj_service);
	HAL_UART_Transmit(&huart2,lj_service,strlen(lj_service),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;
	
	printf(open);
	HAL_UART_Transmit(&huart2,open,strlen(open),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;
	
	printf(send);
	HAL_UART_Transmit(&huart2,send,strlen(send),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;

}

int fputc(int ch,FILE* f)
{
	uint8_t tmp[1] = {ch};
	
	HAL_UART_Transmit(&huart1,tmp,1,0xff);
	return ch;
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  //.....
  
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&re_buf,1);
	HAL_UART_Transmit(&huart2,"les't go\r\n",strlen("les't go\r\n"),100);
	connect_wifi();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		printf("hello\r\n");
		HAL_Delay(1000);
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

esp作为服务器

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "string.h"
#include "stdio.h"

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */
uint16_t UART1_RX_STA;
uint8_t re_buf;
uint8_t buf[1024];

char buf_wifi[20];

char mode[] = "AT+CWMODE=2\r\n";
char dlj[] = "AT+CIPMUX=1\r\n";
char TCP_Server[] = "AT+CIPSERVER=1\r\n";
char send[] = "AT+CIPSEND=0,7\r\n";
char reset[] = "AT+RST\r\n";

char AT_OK=0;

char AT_Connect_Net_Flag=0;

char send_ok = 0;

char i_flag=0;
void connect_wifi();

/* USER CODE END PV */
/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance == USART1){
        //判断标志位最高位是否为1
		if((UART1_RX_STA&0x8000) == 0){
            //判断标志位第二位是否为1
			if(UART1_RX_STA & 0x4000){
                //判断是否接收完毕,也就是\n
				if(re_buf==0x0a){
					UART1_RX_STA |= 0x8000;
					
					if(strstr(buf,",CON") != NULL){
						AT_Connect_Net_Flag=1;
					}
					if(!strcmp(buf,"OK")){
						AT_OK=1;
					}
					if(strstr(buf,"alid") != NULL){
						i_flag=1;
					}
					
					if(strstr(buf,"led") != NULL){
						HAL_GPIO_TogglePin(GPIOB,GPIO_PIN_8);
					}
					
					if(strstr(buf,"SEND OK") != NULL){
						send_ok=1;
					}
					
					
					memset(buf, 0, 1024);
					UART1_RX_STA = 0;
					
					
				}else {
					UART1_RX_STA=0;
				}
			}else {
                //判断是否接收到了尾部,也就是\r
				if(re_buf == 0x0d){
					UART1_RX_STA |= 0x4000;
				}else {
          //0x3fff=0011 xxxx xxxx xxxx:就是能接收到数据的最多的个数
          //&0x3fff就是防止数据溢出
					buf[UART1_RX_STA&0x3FFF]=re_buf;
					UART1_RX_STA++;
					if(UART1_RX_STA>99){
						UART1_RX_STA=0;
					}
				}
			}
		}
        //中断接收完毕后,会自动关闭中断,所以这里需要重新打开
		HAL_UART_Receive_IT(&huart1,&re_buf,1);
	}
}

void connect_wifi()
{
	i_flag=0;
	printf(reset);
	HAL_UART_Transmit(&huart2,reset,strlen(reset),100);
	while(!i_flag) HAL_Delay(50);
	i_flag=0;
	AT_OK=0;
	
	printf(mode);
	HAL_UART_Transmit(&huart2,mode,strlen(mode),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;
	
	
	printf(dlj);
	HAL_UART_Transmit(&huart2,dlj,strlen(dlj),100);
	while(!AT_OK) HAL_Delay(50);
	AT_OK=0;
	
	
	printf(TCP_Server);
	HAL_UART_Transmit(&huart2,TCP_Server,strlen(TCP_Server),100);
	while(!AT_OK) HAL_Delay(50);
	
	AT_OK=0;
	HAL_UART_Transmit(&huart2,"go ATCONNEct\r\n",strlen("go ATCONNEct\r\n"),100);
	while(!AT_Connect_Net_Flag) HAL_Delay(50);
	AT_Connect_Net_Flag=0;

}

int fputc(int ch,FILE* f)
{
	uint8_t tmp[1] = {ch};
	
	HAL_UART_Transmit(&huart1,tmp,1,0xff);
	return ch;
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  /* USER CODE BEGIN 2 */
	HAL_UART_Receive_IT(&huart1,&re_buf,1);
	HAL_UART_Transmit(&huart2,"les't go\r\n",strlen("les't go\r\n"),100);
	
	HAL_Delay(2000);
	
	connect_wifi();
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
		
		//发送数据
		HAL_UART_Transmit(&huart2,send,strlen(send),100);
		printf(send);
		while(!AT_OK) HAL_Delay(50);
		AT_OK = 0;
		
		printf("hello\r\n");
		while(!send_ok)HAL_Delay(50);
		send_ok = 0;
		HAL_Delay(2000);
		
		
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

这一段依然有问题,就是发送一段时间的数据后,莫名其妙的error或者FAIL

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值