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


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

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

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

    二、代码部分

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

    1. #include "main.h"
    2. #include "usart.h"
    3. #include "gpio.h"
    4. /* Private includes ----------------------------------------------------------*/
    5. /* USER CODE BEGIN Includes */
    6. #include <stdio.h>
    7. #include <string.h>
    8. /* USER CODE END Includes */
    9. /* Private typedef -----------------------------------------------------------*/
    10. /* USER CODE BEGIN PTD */
    11. /* USER CODE END PTD */
    12. /* Private define ------------------------------------------------------------*/
    13. /* USER CODE BEGIN PD */
    14. //串口接收缓存(1字节)
    15. uint8_t buf=0;
    16. //定义最大接收字节数 200,可根据需求调整
    17. #define UART1_REC_LEN 200
    18. // 接收缓冲, 串口接收到的数据放在这个数组里,最大UART1_REC_LEN个字节
    19. uint8_t UART1_RX_Buffer[UART1_REC_LEN];
    20. // 接收状态
    21. // bit15, 接收完成标志
    22. // bit14, 接收到0x0d
    23. // bit13~0, 接收到的有效字节数目
    24. uint16_t UART1_RX_STA=0;
    25. #define SIZE 12
    26. char buffer[SIZE];
    27. /* USER CODE END PD */
    28. /* Private macro -------------------------------------------------------------*/
    29. /* USER CODE BEGIN PM */
    30. /* USER CODE END PM */
    31. /* Private variables ---------------------------------------------------------*/
    32. /* USER CODE BEGIN PV */
    33. /* USER CODE END PV */
    34. /* Private function prototypes -----------------------------------------------*/
    35. void SystemClock_Config(void);
    36. /* USER CODE BEGIN PFP */
    37. /* USER CODE END PFP */
    38. /* Private user code ---------------------------------------------------------*/
    39. /* USER CODE BEGIN 0 */
    40. // 接收完成回调函数,收到一个数据后,在这里处理
    41. void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    42. {
    43. // 判断中断是由哪个串口触发的
    44. if(huart->Instance == USART1)
    45. {
    46. // 判断接收是否完成(UART1_RX_STA bit15 位是否为1
    47. if((UART1_RX_STA & 0x8000) == 0)
    48. {
    49. // 如果已经收到了 0x0d (回车),
    50. if(UART1_RX_STA & 0x4000)
    51. {
    52. // 则接着判断是否收到 0x0a (换行)
    53. if(buf == 0x0a)
    54. {
    55. // 如果 0x0a 和 0x0d 都收到,则将 bit15 位置为1
    56. UART1_RX_STA |= 0x8000;
    57. // 灯控指令
    58. if(!strcmp(UART1_RX_Buffer, "L-1"))
    59. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_RESET);
    60. if(!strcmp(UART1_RX_Buffer, "L-0"))
    61. HAL_GPIO_WritePin(GPIOB, GPIO_PIN_8, GPIO_PIN_SET);
    62. memset(UART1_RX_Buffer, 0, UART1_REC_LEN);
    63. UART1_RX_STA = 0;
    64. }
    65. else
    66. // 否则认为接收错误,重新开始
    67. UART1_RX_STA = 0;
    68. }
    69. else // 如果没有收到了 0x0d (回车)
    70. {
    71. //则先判断收到的这个字符是否是 0x0d (回车)
    72. if(buf == 0x0d)
    73. {
    74. // 是的话则将 bit14 位置为1
    75. UART1_RX_STA |= 0x4000;
    76. }
    77. else
    78. {
    79. // 否则将接收到的数据保存在缓存数组里
    80. UART1_RX_Buffer[UART1_RX_STA & 0X3FFF] = buf;
    81. UART1_RX_STA++;
    82. // 如果接收数据大于UART1_REC_LEN(200字节),则重新开始接收
    83. if(UART1_RX_STA > UART1_REC_LEN - 1)
    84. UART1_RX_STA = 0;
    85. }
    86. }
    87. }
    88. // 重新开启中断
    89. HAL_UART_Receive_IT(&huart1, &buf, 1);
    90. }
    91. }
    92. int fputc(int ch, FILE *f)
    93. {
    94. unsigned char temp[1]={ch};
    95. HAL_UART_Transmit(&huart1,temp,1,0xffff);
    96. return ch;
    97. }
    98. int main(void)
    99. {
    100. /* USER CODE BEGIN 1 */
    101. /* USER CODE END 1 */
    102. /* MCU Configuration--------------------------------------------------------*/
    103. /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    104. HAL_Init();
    105. /* USER CODE BEGIN Init */
    106. /* USER CODE END Init */
    107. /* Configure the system clock */
    108. SystemClock_Config();
    109. /* USER CODE BEGIN SysInit */
    110. /* USER CODE END SysInit */
    111. /* Initialize all configured peripherals */
    112. MX_GPIO_Init();
    113. MX_USART1_UART_Init();
    114. MX_USART2_UART_Init();
    115. /* USER CODE BEGIN 2 */
    116. HAL_NVIC_SetPriority(SysTick_IRQn,0,0);
    117. // 开启接收中断
    118. HAL_UART_Receive_IT(&huart1, &buf, 1);
    119. HAL_UART_Transmit(&huart2, "let's go\r\n", strlen("let's go\r\n"), 100);
    120. /* USER CODE END 2 */
    121. /* Infinite loop */
    122. /* USER CODE BEGIN WHILE */
    123. while (1)
    124. {
    125. /* USER CODE END WHILE */
    126. /* USER CODE BEGIN 3 */
    127. HAL_Delay(2000);
    128. }
    129. /* USER CODE END 3 */
    130. }

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

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

  • 相关阅读:
    Numpy.array数组学习笔记(数组结构详解,数组操作方法,数组读取方法,数组计算方法,数组画图方法,数组存储方法)
    机器视觉工程师前景如何,计算机视觉工程师前景
    有大量虾皮买家号想防关联该怎么做?
    特殊版:SpreadJS v15.1 VS SpreadJS v15.0
    DataFun: 微信NLP算法微服务治理
    Linux 之nmcli网络配置命令
    有趣的 Go HttpClient 超时机制
    ES6类和装饰器的使用总结
    痞子衡嵌入式半月刊: 第 81 期
    深入浅出Java的多线程编程——第一篇
  • 原文地址:https://blog.csdn.net/weixin_51374594/article/details/133998227