你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32 WIFI 上位机 UDP协议 控制  

[复制链接]
lovewyufeng 发布时间:2015-1-23 10:45
本帖最后由 lovewyufeng 于 2015-1-23 12:07 编辑
预备知识 请看下面两贴

STM32 如何快速创建 FREERTOS和RTX 工程
干货 Nucleo072 usart 基于RTOS的应用 方便AT指令类外设开发

使用的 Nucleo 072板子  其他用户请稍许移植一下

原本楼主发上面两贴就开始策划 这个东西 计划参加 方案大赛的。

原方案计划设计一个 智能 开关局域网内 PC  手机APP 可同时管理所有灯具,按键使用 F0的触摸模块,使用WIFI 和433
组网,目前淘宝有十分成熟的 智能灯开关产品 不过都是用RF实现有兴趣可以搜索一下。

结果最近太忙没空弄这个,加之考虑到本方案一个缺陷 那就是WIFI模块加入的热点需要配置。如果使用433模块再设计一套

可以配置WIFI的协议那是相当恐怖的  首先你的 433 主机(其他产品的遥控器)得支持液晶显示了,反正很麻烦了。不整了

现在将第一步完成的 内容分享大家参考  AT WIFI 产品设计,甚至蓝牙串口也可按同样的模式设计  。,纯串口当然不用说了


模块使用的 是8266 连接单片机 串口1  PA9 PA10引脚
下面是 效果。,上位机还没写,使用网络调试助手 给模块发送指令下位机执行相应操作

截图发送了 3条指令  get ip ,get cpu id,和 set led on

使用串口助手或者超级终端波特率115200 连接 stlink的虚拟串口 可以看到调试输出内容截图左边
实际操作可看到板子上LD2 可由 set led on 打开或者又 set led off关闭



复制代码


累死了  论坛竟然限制 发帖最大字符数   10000 帖子太长发帖失败  内容都没了 ,,,可怜的重新码了一次。。。

USART_WIFI.zip

下载

4.71 MB, 下载次数: 306

SocketTest.rar

下载

330.85 KB, 下载次数: 321

收藏 6 评论27 发布时间:2015-1-23 10:45

举报

27个回答
lovewyufeng 回答时间:2015-1-23 10:50:47
下面贴几个关键函数 讲解一下


  1. void USART1_IRQHandler()
  2. {
  3.         UART_HandleTypeDef *huart= &UartHandle1;
  4.        
  5.         /* UART parity error interrupt occurred -------------------------------------*/
  6.   if((__HAL_UART_GET_IT(huart, UART_IT_PE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_PE) != RESET))
  7.   {
  8.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_PEF);
  9.    
  10.     huart->ErrorCode |= HAL_UART_ERROR_PE;
  11.     /* Set the UART state ready to be able to start again the process */
  12.     huart->State = HAL_UART_STATE_READY;
  13.   }
  14.   
  15.   /* UART frame error interrupt occured --------------------------------------*/
  16.   if((__HAL_UART_GET_IT(huart, UART_IT_FE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  17.   {
  18.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_FEF);
  19.    
  20.     huart->ErrorCode |= HAL_UART_ERROR_FE;
  21.     /* Set the UART state ready to be able to start again the process */
  22.     huart->State = HAL_UART_STATE_READY;
  23.   }
  24.   
  25.   /* UART noise error interrupt occured --------------------------------------*/
  26.   if((__HAL_UART_GET_IT(huart, UART_IT_NE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  27.   {
  28.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_NEF);
  29.    
  30.     huart->ErrorCode |= HAL_UART_ERROR_NE;   
  31.     /* Set the UART state ready to be able to start again the process */
  32.     huart->State = HAL_UART_STATE_READY;
  33.   }
  34.   
  35.   /* UART Over-Run interrupt occured -----------------------------------------*/
  36.   if((__HAL_UART_GET_IT(huart, UART_IT_ORE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_ERR) != RESET))
  37.   {
  38.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_OREF);
  39.    
  40.     huart->ErrorCode |= HAL_UART_ERROR_ORE;     
  41.     /* Set the UART state ready to be able to start again the process */
  42.     huart->State = HAL_UART_STATE_READY;
  43.   }
  44.   
  45.    /* Call UART Error Call back function if need be --------------------------*/
  46.   if(huart->ErrorCode != HAL_UART_ERROR_NONE)
  47.   {
  48.     HAL_UART_ErrorCallback(huart);
  49.   }
  50.   
  51. #if !defined(STM32F030x6) && !defined(STM32F030x8)  
  52.   /* UART wakeup from Stop mode interrupt occurred -------------------------------------*/
  53.   if((__HAL_UART_GET_IT(huart, UART_IT_WUF) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_WUF) != RESET))
  54.   {
  55.     __HAL_UART_CLEAR_IT(huart, UART_CLEAR_WUF);
  56.     /* Set the UART state ready to be able to start again the process */
  57.     huart->State = HAL_UART_STATE_READY;
  58.     HAL_UART_WakeupCallback(huart);
  59.   }
  60. #endif /* !defined(STM32F030x6) && !defined(STM32F030x8) */
  61.   
  62.   /* UART in mode Receiver ---------------------------------------------------*/
  63.   if((__HAL_UART_GET_IT(huart, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(huart, UART_IT_RXNE) != RESET))
  64.   {
  65.     /* Clear RXNE interrupt flag */
  66.                
  67.                 rx_buf[0].buff[rx_buf[0].rx_index]=huart->Instance->RDR;
  68.                 //huart->Instance->TDR=rx_buf.buff[rx_buf.rx_index];
  69.                 rx_buf[0].rx_index++;//储存接收到的数据到 缓冲区
  70.                 osSemaphoreRelease(usart_Rx[0]);//通知  scanf 有数据收到
  71.                 if(rx_buf[0].rx_index==BUFFSIZE)
  72.                 {
  73.                         rx_buf[0].rx_index=0;
  74.                 }
  75.                 if(rx_buf[0].rx_index==rx_buf[0].save_index)
  76.                 {
  77.                         rx_buf[0].save_index++;
  78.                         if(rx_buf[0].save_index==BUFFSIZE)
  79.                         {
  80.                                 rx_buf[0].save_index=0;
  81.                         }
  82.                 }
  83.                  __HAL_UART_SEND_REQ(huart, UART_RXDATA_FLUSH_REQUEST);

  84.   }

  85. }
复制代码


//下面这个函数被scanf所调用

  1. int fgetc(FILE* f)
  2. {
  3.                 osStatus st;
  4.        
  5.         char index=0;
  6.         int ch;
  7.        
  8.         if(f->usart==USART2)
  9.         {
  10.         index=1;
  11.         }
  12.        
  13. if(rx_buf[index].rx_index!=rx_buf[index].save_index)
  14. {
  15.         ch= rx_buf[index].buff[rx_buf[index].save_index++];
  16.         if(rx_buf[index].save_index==BUFFSIZE)
  17.         {
  18.         rx_buf[index].save_index=0;
  19.         }
  20.         return ch;//缓冲区有数据则取得数据
  21. }
  22. else
  23. {//没有数据等待数据
  24.                 if(index==0)
  25.                 {
  26.                         st=osSemaphoreWait(usart_Rx[index],wifi_wait);
  27.                 }
  28.                 else
  29.                 {
  30.                 st=osSemaphoreWait(usart_Rx[index],usart_wait);
  31.                 }
  32.         if(st!=osOK)
  33.                 return EOF;
  34. return fgetc(f);
  35. }

  36. }
复制代码

//这个函数用于发送 指令给WIFI
  1. int Send_Wifi_cmd(const char *str,unsigned int wait,char *buf)
  2. {
  3.                         int ERR;
  4.                         fprintf(&wifi,"%s\r\n",str);//发送指令
  5.                         set_wifi_wait(wait);//设置超时时间
  6.                                 if(fscanf(&wifi,"%s",buf)!=EOF)//扫描模块返回
  7.                                 {
  8.                                 fprintf(stdout,"%s\r\n",buf);
  9.                                 }
  10.                                 while(1)
  11.                                 {//循环扫描模块返回 直到超时或者返回OK或 ERROR
  12.                                 if(fscanf(&wifi,"%s",buf)==EOF)
  13.                                 {
  14.                                         break;
  15.                                 }
  16.                                 set_wifi_wait(1000);
  17.                                 fprintf(stdout,"%s\r\n",buf);
  18.                                
  19.                                 if(fscanf(&wifi,"%s",buf)==EOF)
  20.                                 {
  21.                                         ERR=osEventTimeout;
  22.                                         break;
  23.                                 }
  24.                                 //set_usat_wait(500);
  25.                                 fprintf(stdout,"%s\r\n",buf);
  26.                                 if(memcmp("OK",buf,2)==0)
  27.                                 {
  28.                                         ERR=osOK;
  29.                                                 break;
  30.                                 }
  31.                                 else if(memcmp("ERROR",buf,5)==0)
  32.                                 {
  33.                                         ERR=osErrorOS;
  34.                                                 break;
  35.                                 }
  36.                                
  37.                                 }
  38.                                 return ERR;
  39.                                
  40. }
复制代码



lovewyufeng 回答时间:2015-1-23 10:57:36

  1. static char buf[40];
  2. void  usart_wifi(void const * argument)//WIFI的线程
  3. {
  4.                         static char IP[20];
  5.                         if(AT_test())
  6.                         {
  7.                                 Send_Wifi_cmd("AT+CIOBAUD=115200",300,buf);
  8.                         }
  9.                         usart_init(115200);
  10.                        
  11.                         Send_Wifi_cmd("AT+RST",500,buf);
  12.                         Send_Wifi_cmd("AT+CWMODE=?",500,buf);
  13.                         //Send_Wifi_cmd("AT+CWLAP",5000,buf);
  14.                         Send_Wifi_cmd("AT+CWJAP="TP-LINK_C6FC68","123456789"",5000,buf); //加入热点
  15.                         Send_Wifi_cmd("AT+CWJAP?",300,buf);
  16.                         Send_Wifi_cmd("AT+CIPMUX=1",300,buf);//启动多连接
  17.                         Send_Wifi_cmd("AT+CIPSERVER=1,1234",300,buf);//启动服务器模式
  18.                        
  19.                         fprintf(&wifi,"AT+CIFSR\r\n");//获取 模块IP
  20.                         set_wifi_wait(1000);
  21.                         fscanf(&wifi,"%s",buf);
  22.                         printf("%s",buf);
  23.                         fscanf(&wifi,"%s%*s",buf);
  24.                         printf("%s",buf);
  25.                         if(memcmp("ERROR",buf,5)!=0)
  26.                         {
  27.                         memcpy(IP,&buf,20);//储存IP  由于模块IP是DHCP动态获取的  上位机APP无法预知IP地址所以 模块先获得自己IP 储存等待上位机使用 UDP                                  //广播get ip 命令获取IP
  28.                         printf("%s",IP);
  29.                         }
  30.                         Connect(buf,1,"UDP","192.168.2.255",1234);//启动UDP模式
  31.                         set_wifi_wait(50);
  32.                         set_wifi_wait(osWaitForever);
  33.                        
  34.                                 if(fscanf(&wifi,"%[^\n]",buf)==EOF);
  35.                                 fprintf(stdout,"%s\r\n",buf);

  36.                        
  37.                                 while(1)
  38.                                 {
  39.                                         timeout:
  40.                                 set_wifi_wait(osWaitForever);
  41.                                 if(fscanf(&wifi,"%*9c%[^\n]",buf)==EOF)goto timeout;//扫描 WIFI输出
  42.                                         {
  43.                                                 char cmd[5];
  44.                                                 fprintf(stdout,"%s\r\n",buf);
  45.                                                
  46.                                                 sscanf(buf,"%*d:%s%*c%[^\n]",cmd,buf);//解析命令
  47.                                                 printf("%s\r\n",cmd);
  48.                                                
  49.                                                 fscanf(&wifi,"%*s");
  50.                                         if(memcmp("get",cmd,3)==0)//get data 如果是get命令
  51.                                         {
  52.                                                
  53.                                                 if(memcmp("ip",buf,2)==0)// get ip命令
  54.                                                 {
  55.                                                         send_data(IP,buf);//发送本机IP
  56.                                                 }
  57.                                                 else if(memcmp("cpu id",buf,6)==0)
  58.                                                 {
  59.                                                 send_data("CPU uid",buf);
  60.                                                 }
  61.                                                 }
  62.                                         else if(memcmp("set",cmd,3)==0) //set data
  63.                                         {
  64.                                                 if(memcmp("led on",buf,6)==0)
  65.                                                 {
  66.                                                 GPIOA->ODR|=GPIO_PIN_5;
  67.                                                         send_data("LD2 ON",buf);
  68.                                                 }
  69.                                                 else if (memcmp("led off",buf,7)==0)
  70.                                                 {
  71.                                                 GPIOA->ODR&=~GPIO_PIN_5;
  72.                                                         send_data("LD2 OFF",buf);
  73.                                                 }
  74.                                         }       
  75.                                         }
  76.                                 }
  77. }
复制代码




注意usart_wifi.c 一开始有 几个 FILE定义  主要是为了区分  printf 和 scanf 操作的 串口

QQ图片20150123103258.png QQ图片20150123103406.png


然后需要注意 8266 TX右边的 引脚是需要接VCC的

QQ截图20150123103904.jpg
巅峰残狼 回答时间:2015-1-23 16:29:25
lovewyufeng 发表于 2015-1-23 11:05
建议 MCU调试的时候的使用两个串口 一个用于和 WIFI通信 另一个将WIFI回复内容  全部上传  方便调试 ...

另外一个已经占用了,太纠结了,呵呵!\r\n已经加上了,不是这个的原因,先前配置都是这么处理的,配置提交都成功了,到这步卡死了
巅峰残狼 回答时间:2015-1-23 11:03:04
Hi,楼主,我用WiFi模块设置为STA模式,串口配置工具配置的时候是通讯正常的,但是写程序的时候同样的参数就是连不上路由器,但是配置已经成功了,就是到连接路由器连不上了,楼主遇到过这种问题吗
lovewyufeng 回答时间:2015-1-23 11:05:16
巅峰残狼 发表于 2015-1-23 11:03
Hi,楼主,我用WiFi模块设置为STA模式,串口配置工具配置的时候是通讯正常的,但是写程序的时候同样的参数 ...

建议 MCU调试的时候的使用两个串口 一个用于和 WIFI通信 另一个将WIFI回复内容  全部上传  方便调试
lovewyufeng 回答时间:2015-1-23 11:05:48
巅峰残狼 发表于 2015-1-23 11:03
Hi,楼主,我用WiFi模块设置为STA模式,串口配置工具配置的时候是通讯正常的,但是写程序的时候同样的参数 ...

有可能 命令忘记 \r\n了?
lovewyufeng 回答时间:2015-1-23 11:10:19
效果图不见了  现在补上

QQ图片20150123095513.jpg
埃斯提爱慕 回答时间:2015-1-23 11:16:37
提示: 作者被禁止或删除 内容自动屏蔽
witnessiz 回答时间:2015-1-23 11:55:49
不错,支持,有空试下
feel-376797 回答时间:2015-1-23 12:06:58
谢谢楼主分享!
lovewyufeng 回答时间:2015-1-23 12:10:58
witnessiz 发表于 2015-1-23 11:55
不错,支持,有空试下

哈哈 wit 出现了~~
moyanming2013 回答时间:2015-1-23 16:41:04
LZ好人啊
大秦正声 回答时间:2015-1-23 17:02:34
用的啥wifi模块啊?
lkl0305 回答时间:2015-1-23 17:16:46
好帖,学习下
12下一页

所属标签

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版