基于stm32控制的4G模块在设备模式下通讯

这里的32控制其实和51的控制思路都是一样的,都是先利用一个网络助手将家里的无线网生成局域网,接着通过花生壳软件将局域网变成公共网,最后是利用串口助手,在4G模块的AT指令模式写入命令 AT+SOCK=TCPC,公共网IP地址 ,公共网端口号,让其连接上公共网。里程如下图所示,具体的细节可以看看我写的51的文章, http://t.csdnimg.cn/P1Pat

其实说白了,就是局域网受限制,但是变成公共网络之后就不受限制了,接着在与4G模块,就可以实现局域网与4G模块通信了。打个比方,如下图

局域网想要和4G通讯,但是中间隔了"一堵墙"(实际是两者无法识别),这时候作为"锥子"的花生壳打通了墙(即让局域网变成了公共网),然后二者就可以通讯了,接着4G收到了来自公共网信息(公共网的信息来自生成生成局域网的网络助手1),4G模块通过TX发送给单片机命令,实现控制。

二、代码部分

51的思路一样,都是单片机接收到数据进入中断,然后开始控制

#include "main.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include <stdio.h>
#include <string.h>
/* USER CODE END Includes */

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

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
//串口接收缓存(1字节)
uint8_t buf=0;

//定义最大接收字节数 200,可根据需求调整
#define UART1_REC_LEN 200

// 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
uint8_t UART1_RX_Buffer[UART1_REC_LEN];

//  接收状态
//  bit15,      接收完成标志
//  bit14,      接收到0x0d
//  bit13~0,    接收到的有效字节数目
uint16_t UART1_RX_STA=0;

#define SIZE 12

char buffer[SIZE];
/* USER CODE END PD */

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

/* USER CODE END PM */

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

/* USER CODE BEGIN PV */

/* 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)
	{
		// 判断接收是否完成(UART1_RX_STA bit15 位是否为1)
		if((UART1_RX_STA & 0x8000) == 0)
		{
			// 如果已经收到了 0x0d (回车),
			if(UART1_RX_STA & 0x4000)
			{
				// 则接着判断是否收到 0x0a (换行)
				if(buf == 0x0a)
				{
					// 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1
					UART1_RX_STA |= 0x8000;

					// 灯控指令
					if(!strcmp(UART1_RX_Buffer, "L-1"))
						HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
					
					if(!strcmp(UART1_RX_Buffer, "L-0"))
						HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
					
					memset(UART1_RX_Buffer, 0, UART1_REC_LEN);
					UART1_RX_STA = 0;
				}
				else
					// 否则认为接收错误,重新开始
					UART1_RX_STA = 0;
			}
			else	// 如果没有收到了 0x0d (回车)
			{
				//则先判断收到的这个字符是否是 0x0d (回车)
				if(buf == 0x0d)
				{
					// 是的话则将 bit14 位置为1
					UART1_RX_STA |= 0x4000;
				}
				else
				{
					// 否则将接收到的数据保存在缓存数组里
					UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;
					UART1_RX_STA++;
					
					// 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收
					if(UART1_RX_STA > UART1_REC_LEN - 1)
						UART1_RX_STA = 0;
				}
			}
		}
		// 重新开启中断
		HAL_UART_Receive_IT(&huart1, &buf, 1);
	}
}

int fputc(int ch, FILE *f)
{      
	unsigned char temp[1]={ch};
	HAL_UART_Transmit(&huart1,temp,1,0xffff);  
	return ch;
}
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_NVIC_SetPriority(SysTick_IRQn,0,0);
	// 开启接收中断
	HAL_UART_Receive_IT(&huart1, &buf, 1);
	HAL_UART_Transmit(&huart2, "let's go\r\n", strlen("let's go\r\n"), 100);

  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
		HAL_Delay(2000);
  }
  /* USER CODE END 3 */
}

最后不要忘记fputc函数的加入,记得在keil里勾选Use Micro LIB

全都弄好后,你会发现,这玩意和蓝牙一个效果,但是它的功能蓝牙强大。

相关推荐
御风_2122 分钟前
STM32单片机使用CAN协议进行通信
stm32·单片机·嵌入式硬件
逝灮1 小时前
【蓝桥杯——物联网设计与开发】拓展模块3 - 温度传感器模块
驱动开发·stm32·单片机·嵌入式硬件·物联网·蓝桥杯·温度传感器
Wallace Zhang3 小时前
STM32F407 | Embedded IDE01 - vscode搭建Embedded IDE开发环境(支持JLINK、STLINK、DAPLINK)
ide·vscode·stm32
youk1104 小时前
STM32 HAL库之配置数据FLASH存储
stm32·单片机·嵌入式硬件
小菜鸟学代码··5 小时前
STM32相关知识及其创建工程
stm32·单片机·嵌入式硬件
沐欣工作室_lvyiyi19 小时前
基于单片机的无线水塔监控系统设计(论文+源码)
人工智能·stm32·单片机·嵌入式硬件·单片机毕业设计
云山工作室1 天前
基于单片机的智能照明控制系统(论文+源码
stm32·单片机·嵌入式硬件·毕业设计·毕设
前面的题目以后再来探索吧1 天前
ota-总结--wifi
stm32·单片机
Whappy0011 天前
《第十二部分》1.STM32之RTC实时时钟介绍---BKP实验
stm32·嵌入式硬件·实时音视频
嵌入式科普1 天前
十一、e2studio VS STM32CubeIDE之宏函数展开
stm32·瑞萨·cubeide·e2studio