

其实说白了,就是局域网受限制,但是变成公共网络之后就不受限制了,接着在与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

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