UART.c

#include "stm32f1xx_it.h"
#include "LED.h"
#include "UART.h"
#include "string.h" UART_HandleTypeDef huart1;
UART_HandleTypeDef huart3; #define RXBUFFERSIZE 4096 //最大接收字节数 char RxBuffer1[RXBUFFERSIZE]; //接收数据
uint8_t aRxBuffer1; //接收中断缓冲
uint32_t Uart1_Rx_Cnt = 0; //接收缓冲计数 char RxBuffer3[RXBUFFERSIZE]; //接收数据
uint8_t aRxBuffer3; //接收中断缓冲
uint32_t Uart3_Rx_Cnt = 0; //接收缓冲计数 /**
* @brief USART1 Initialization Function
* @param None
* @retval None
*/
void MX_USART1_UART_Init(void){
/* USER CODE BEGIN USART1_Init 0 */ /* USER CODE END USART1_Init 0 */ /* USER CODE BEGIN USART1_Init 1 */ /* USER CODE END USART1_Init 1 */
huart1.Instance = USART1;
huart1.Init.BaudRate = 115200;
huart1.Init.WordLength = UART_WORDLENGTH_8B;
huart1.Init.StopBits = UART_STOPBITS_1;
huart1.Init.Parity = UART_PARITY_NONE;
huart1.Init.Mode = UART_MODE_TX_RX;
huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart1.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart1) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART1_Init 2 */
HAL_UART_MspInit(&huart1);
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer1, 1); //开启接收中断
/* USER CODE END USART1_Init 2 */
} /**
* @brief USART3 Initialization Function
* @param None
* @retval None
*/
void MX_USART3_UART_Init(void)
{
/* USER CODE BEGIN USART3_Init 0 */ /* USER CODE END USART3_Init 0 */ /* USER CODE BEGIN USART3_Init 1 */ /* USER CODE END USART3_Init 1 */
huart3.Instance = USART3;
huart3.Init.BaudRate = 115200;
huart3.Init.WordLength = UART_WORDLENGTH_8B;
huart3.Init.StopBits = UART_STOPBITS_1;
huart3.Init.Parity = UART_PARITY_NONE;
huart3.Init.Mode = UART_MODE_TX_RX;
huart3.Init.HwFlowCtl = UART_HWCONTROL_NONE;
huart3.Init.OverSampling = UART_OVERSAMPLING_16;
if (HAL_UART_Init(&huart3) != HAL_OK)
{
Error_Handler();
}
/* USER CODE BEGIN USART3_Init 2 */
HAL_UART_MspInit(&huart3);
HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer3, 1); //再开启接收中断
/* USER CODE END USART3_Init 2 */
} /**
* @brief This function is executed in case of error occurrence.
* @retval None
*/
void Error_Handler(void)
{
/* USER CODE BEGIN Error_Handler_Debug */
/* User can add his own implementation to report the HAL error return state */
__disable_irq();
while (1){}
/* USER CODE END Error_Handler_Debug */
} void send_to_Usart3(char * cmd){
HAL_UART_Transmit(&huart3, (uint8_t *)cmd,strlen(cmd),0xFFFF);
while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
} void show_Usart3_Message(){
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer3, Uart3_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart3_Rx_Cnt = 0;
memset(RxBuffer3,0x00,sizeof(RxBuffer3)); //清空数组
} void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart){
if(huart->Instance==USART1){
if(Uart1_Rx_Cnt >= (RXBUFFERSIZE-1)){ //溢出判断
Uart1_Rx_Cnt = 0;
memset(RxBuffer1,0x00,sizeof(RxBuffer1));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}else{
RxBuffer1[Uart1_Rx_Cnt++] = aRxBuffer1; //接收数据转存
//HAL_UART_Transmit(&huart3, (uint8_t *)test, sizeof(test),0xFFFF); /*
if((RxBuffer1[Uart1_Rx_Cnt-1] == 0x0A)&&(RxBuffer1[Uart1_Rx_Cnt-2] == 0x0D)){ //判断结束位
HAL_UART_Transmit(&huart3, (uint8_t *)&RxBuffer1, Uart1_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart3) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart1_Rx_Cnt = 0;
memset(RxBuffer1,0x00,sizeof(RxBuffer1)); //清空数组
}
*/
}
HAL_UART_Receive_IT(&huart1, (uint8_t *)&aRxBuffer1, 1); //再开启接收中断
}
if(huart->Instance==USART3){
if(Uart3_Rx_Cnt >= (RXBUFFERSIZE-1)){ //溢出判断
Uart3_Rx_Cnt = 0;
memset(RxBuffer3,0x00,sizeof(RxBuffer3));
HAL_UART_Transmit(&huart1, (uint8_t *)"数据溢出", 10,0xFFFF);
}else{
RxBuffer3[Uart3_Rx_Cnt++] = aRxBuffer3; //接收数据转存
/*
if(((RxBuffer3[Uart3_Rx_Cnt-1] == 0x0A)&&(RxBuffer3[Uart3_Rx_Cnt-2] == 0x0D))){ //判断结束位
HAL_UART_Transmit(&huart1, (uint8_t *)&RxBuffer3, Uart3_Rx_Cnt,0xFFFF); //将收到的信息发送出去
while(HAL_UART_GetState(&huart1) == HAL_UART_STATE_BUSY_TX);//检测UART发送结束
Uart3_Rx_Cnt = 0;
memset(RxBuffer3,0x00,sizeof(RxBuffer3)); //清空数组
}
*/
}
HAL_UART_Receive_IT(&huart3, (uint8_t *)&aRxBuffer3, 1); //再开启接收中断
}
} //重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f){
/* 发送一个字节数据到串口DEBUG_USART */
HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);
return (ch);
}

main.c

/**
* @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_USART3_UART_Init();
/* USER CODE BEGIN 2 */
LED_GPIO_Config();
esp8266_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
//unsigned char hello[]="hello\n\r";
//HAL_UART_Transmit(&huart1,hello,sizeof(hello),0x10);
HAL_Delay(2000);
show_Usart3_Message(); char cmd1[]="AT+CWLAP\r\n";
send_to_Usart3(cmd1);
HAL_Delay(10000);
show_Usart3_Message(); char cmd2[]="AT+CWJAP=\"Redmi K30\",\"lpnb6666\"\r\n";
send_to_Usart3(cmd2);
HAL_Delay(20000);
show_Usart3_Message(); char cmd4[]="AT+CIPMUX=0\r\n";
send_to_Usart3(cmd4);
HAL_Delay(3000);
show_Usart3_Message(); char cmd5[]="AT+CIPMODE=1\r\n";
send_to_Usart3(cmd5);
HAL_Delay(3000);
show_Usart3_Message(); char cmd3[]="AT+CIFSR\r\n";
send_to_Usart3(cmd3);
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3("AT+CIPSTART=\"TCP\",\"192.168.43.193\",8899\r\n");
HAL_Delay(10000);
show_Usart3_Message(); send_to_Usart3("AT+CIPSEND\r\n");
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3(">\r\n");
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3("lp\r\n");
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3("123456\r\n");
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3("hello everyone\r\n");
HAL_Delay(3000);
show_Usart3_Message(); send_to_Usart3("+++");
HAL_Delay(3000);
show_Usart3_Message();
while (1)
{
send_to_Usart3("AT\r\n");
HAL_Delay(1000);
show_Usart3_Message();
}
/* USER CODE END 3 */
}

注意事项:

首先,不能连续 发AT+指令,需要等上一个指令处理完再发下一个指令,具体怎么等可以用AT指令查询

其次,不能直接用C库接收,要使用串口中断接收

再次,发送给esp8266模块的数据要以\r\n结尾,数据透传用>\r\n开始,用+++结束,其中+++没有\r\n

【stm32】基于hal库使用野火指南者esp8266 WIFI模块进行TCP传输的更多相关文章

  1. STM32基于HAL库通过DMA读写SDIO

    通过STM32CUBEMX生成DMA读写sdio的工程,再读写过程中总会卡死在DMA中断等待读写完成的while中,最终发现while等待的标志在SDIO的中断里置位的,而SDIO中断优先级如果小于或 ...

  2. STM32 之 HAL库(固件库) _

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  3. STM32 之 HAL库(固件库)

    1 STM32的三种开发方式 通常新手在入门STM32的时候,首先都要先选择一种要用的开发方式,不同的开发方式会导致你编程的架构是完全不一样的.一般大多数都会选用标准库和HAL库,而极少部分人会通过直 ...

  4. 【GMT43智能液晶模块】基于HAL库的SDRAM和LCD驱动例程(MDK工程&CubeMX工程)

    说明: 1.该工程基于HAL库实现动态存储器SDRAM驱动以及液晶控制器LCD驱动. 2.工程通过STM32CubeMX(Version 4.22.0)配置生成,可直接打开进行配置. 3.KEIL M ...

  5. 用ESP8266 WIFI模块连接服务器,并实现与服务器相互通讯

    最近在做一个智能锁的项目,该项目要求实现在任何地方(当然是要有网络的)可以在手机上用APP开锁.而我负责的部分主要是实现底层与服务器连接,并且要能相互通讯.考虑了很多问题,最终选择了用ESP8266 ...

  6. ARDUINO MEGA2560 经过ESP8266 WIFI模块上传温湿度数据到 OneNet 服务器

    简述 原来写了一个C++的wifi库但是发现用c++ arduino这小身板有点扛不住,代码比较大,使用String类型数据处理速度慢,而且很容易无缘无故跑飞.而且封装成库后使用还需要修改arduin ...

  7. STM32串口接收中断——基于HAL库

    写在前面 最近需要使用一款STM32L4系列的芯片进行开发,需要学习使用HAL库.在进行串口中断使用的时候遇到了一些小麻烦,写下解决方案供大家参考. 1.UART相关的头文件引用错误 由于本人直接使用 ...

  8. 基于HAL库的STM32的DSP库详解(附FFT应用)

    1 . 建立工程,生成代码时选择包含所有库.   2. 打开 option for target 选择 Target 标签,在code generatio中,将floating point hardw ...

  9. STM32之HAL库、标准外设库、LL库(STM32 Embedded Software)-(转载)

    STM32 Embedded Software  工作以来一直使用ST的STM32系列芯片,ST为开发者提供了非常方便的开发库.到目前为止,有标准外设库(STD库).HAL库.LL库 三种.前两者都是 ...

随机推荐

  1. 学习java的第二十七天

    一.今日收获 1.java完全学习手册第三章算法的3.2排序,比较了跟c语言排序上的不同 2.观看哔哩哔哩上的教学视频 二.今日问题 1.快速排序法的运行调试多次 2.哔哩哔哩教学视频的一些术语不太理 ...

  2. 20. VIM命令操作技巧

    V可视化选中当前行,根据光标可多行 ctrl+v 可视化块 v可视化根据光标 行间移动 快速增删改查 d 0 删除当前位置到行首 d $ 删除当前位置到行尾 d  t  (" ] ) )符号 ...

  3. Git(一)【基本使用,集成IDEA,GitHub】

    目录 一.本地库操作 ①基本操作 1.初始化本地库 2.设置用户签名|用户名|邮箱 3.查看本地库状态 4.添加暂存区 5.提交到本地库 6.查看文件modify详情 ②历史版本以及回退 1.查看历史 ...

  4. 调试器gdb

    1.启动和退出gdb gdb调试的对象是可执行文件,而不是程序源代码.如果要使一个可执行文件可以被gdb调试,那么在使用编译器gcc编译程序时加入-g选项.-g选项告诉gcc在编译程序时加入调试信息, ...

  5. 快速挂起VIM以及调出被挂起的VIM的方法

    vim中开了多窗口后有时需要临时切出去执行shell指令,查看结果,在vim中用%很不方便查看结果,要切出去又要逐个小窗口:q,非常麻烦. 上网一查竟然有挂起的方法: 挂起:ctrl-z 调出:fg ...

  6. vim使用配置(转)

    在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有行号的.语法高亮度显示.智能缩进等功能的. 为了更好的在vim下进行工作,需要手动配置一个配置文件: .vimrc 在启动vim时,当前用户 ...

  7. zabbix之源码安装

    #:官网地址 https://www.zabbix.com/documentation/4.0/zh/manual/installation/install #:解压并创建用户 root@ubuntu ...

  8. CentOS Linux下编译安装MySQL

    本文参考张宴的Nginx 0.8.x + PHP 5.2.13(FastCGI)搭建胜过Apache十倍的Web服务器(第6版)[原创]完成.所有操作命令都在CentOS 6.4 64位操作系统下实践 ...

  9. SpringMVC(1):SpringMVC入门

    一,MVC 概述 MVC:模型,视图,控制器,是一种软件设计规范,本质是将业务逻辑,数据,显示,分离的方式来编写代码:前后端分离 Model:数据模型,提供要展示的数据,一般我们都会把这两个分离开来. ...

  10. “==” 和 equals()的区别

    ※ "==" 和 equals()的区别 ※ == :比较. 基本数据类型比较的是值:. 引用类型比较的是地址值. ※ equals(Object o):1)不能比较基本数据类型, ...