客户端参数

main.c
image.png
串口1是调试串口,串口2控制8266.
Usart1_Init(9600); //串口1功能初始化,波特率9600
Usart2_Init(115200); //串口2功能初始化,波特率115200

客户端的8266开启透传模式
Usart2_Init(115200); //串口2功能初始化,波特率115200
TIM4_Init(300,7200); //TIM4初始化,定时时间 30072001000/72000000 = 30ms
TIM4和串口2配合,

串口中断程序

服务器的中断程序
image.png
客户端的串口中断程序

  1. /*-------------------------------------------------*/
  2. /*函数名:串口2接收中断函数 */
  3. /*参 数:无 */
  4. /*返回值:无 */
  5. /*-------------------------------------------------*/
  6. void USART2_IRQHandler(void)
  7. {
  8. if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支
  9. if(Connect_flag==0){ //如果Connect_flag等于0,当前还没有连接服务器,处于指令配置状态
  10. if(USART2->DR){ //处于指令配置状态时,非零值才保存到缓冲区
  11. Usart2_RxBuff[Usart2_RxCounter]=USART2->DR; //保存到缓冲区
  12. Usart2_RxCounter ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1
  13. }
  14. }else{ //反之Connect_flag等于1,连接上服务器了
  15. Usart2_RxBuff[Usart2_RxCounter] = USART2->DR; //把接收到的数据保存到Usart2_RxBuff中
  16. if(Usart2_RxCounter == 0){ //如果Usart2_RxCounter等于0,表示是接收的第1个数据,进入if分支
  17. TIM_Cmd(TIM4,ENABLE);
  18. }else{ //else分支,表示果Usart2_RxCounter不等于0,不是接收的第一个数据
  19. TIM_SetCounter(TIM4,0);
  20. }
  21. Usart2_RxCounter ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1
  22. }
  23. }
  24. }
  25. }

如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支
如果Connect_flag等于0,当前还没有连接服务器,处于指令配置状态,把接收到的非零数据存放在Usart2_RxBuff中。
如果Connect_flag等于1,连接上服务器了 ,把接收到的非零数据存放在Usart2_RxBuff中。并使用TIM4判断是否有数据传送过来,若30ms没有数据过来,进入TIM4中断,置位接收完成标志位,完成本次接收。

TIM4中断中,把接收到的数据从Usart2_RxBuff拷贝到Data_buff数组,并在[0]、[1]中记录共接收了多少个字节数据,并在数组结尾加入/0结束符,方便搜素。关闭清零TIM4计时器及其中断。

  1. /*-------------------------------------------------*/
  2. /*函数名:定时器4中断服务函数 */
  3. /*参 数:无 */
  4. /*返回值:无 */
  5. /*-------------------------------------------------*/
  6. void TIM4_IRQHandler(void)
  7. {
  8. if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){ //如果TIM_IT_Update置位,表示TIM4溢出中断,进入if
  9. Usart2_RxCompleted = 1; //串口2接收完成标志位置位
  10. memcpy(&Data_buff[2],Usart2_RxBuff,Usart2_RxCounter); //拷贝数据
  11. Data_buff[0] = WiFi_RxCounter/256; //记录接收的数据量
  12. Data_buff[1] = WiFi_RxCounter%256; //记录接收的数据量
  13. Data_buff[WiFi_RxCounter+2] = '\0'; //加入结束符
  14. WiFi_RxCounter=0; //清零计数值
  15. TIM_Cmd(TIM4, DISABLE); //关闭TIM4定时器
  16. TIM_SetCounter(TIM4, 0); //清零定时器4计数器
  17. TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIM4溢出中断标志
  18. }
  19. }

连接到服务器

  1. /*-------------------------------------------------*/
  2. /*函数名:连接服务器 */
  3. /*参 数:无 */
  4. /*返回值:0:正确 其他:错误 */
  5. /*-------------------------------------------------*/
  6. char WiFi_ConnectServer_AP(void)
  7. {
  8. char res;
  9. char temp[50];
  10. u1_printf("准备复位模块\r\n"); //串口提示数据
  11. if(WiFi_Reset(50)){ //复位,100ms超时单位,总计5s超时时间
  12. u1_printf("复位失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  13. return 1; //返回1
  14. }else u1_printf("复位成功\r\n"); //串口提示数据
  15. u1_printf("准备设置AP模式\r\n"); //串口提示数据
  16. if(WiFi_SendCmd("AT+CWMODE=2",50)){ //设置AP模式,100ms超时单位,总计5s超时时间
  17. u1_printf("设置AP模式失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  18. return 2; //返回2
  19. }else u1_printf("设置AP模式成功\r\n"); //串口提示数据
  20. u1_printf("准备设置AP参数\r\n"); //串口提示数据
  21. u1_printf("SSID:%s\r\n",SSID); //串口提示数据
  22. u1_printf("密码:%s\r\n",PASS); //串口提示数据
  23. u1_printf("AP热点IP:%s\r\n",AP_IP); //串口提示数据
  24. u1_printf("加密方式:WPA_WPA2_PSK\r\n"); //串口提示数据
  25. u1_printf("准备设置AP热点IP\r\n"); //串口提示数据
  26. memset(temp,0,50); //清除临时缓冲区
  27. sprintf(temp,"AT+CIPAP=\"%s\"",AP_IP); //构建命令
  28. if(WiFi_SendCmd(temp,50)){ //设置AP热点IP,100ms超时单位,总计5s超时时间
  29. u1_printf("设置AP热点IP失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  30. return 3; //返回3
  31. }else u1_printf("设置AP热点IP成功\r\n"); //串口提示数据
  32. u1_printf("准备设置AP参数\r\n"); //串口提示数据
  33. if(WiFi_SET_AP(SSID,PASS,WPA_WPA2_PSK,50)){ //设置AP参数,100ms超时单位,总计5s超时时间
  34. u1_printf("设置AP参数失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  35. return 4; //返回4
  36. }else u1_printf("设置AP参数成功\r\n"); //串口提示数据
  37. u1_printf("准备开启透传\r\n"); //串口提示数据
  38. if(WiFi_SendCmd("AT+CIPMODE=1",50)){ //开启透传,100ms超时单位,总计5s超时时间
  39. u1_printf("开启透传失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  40. return 5; //返回5
  41. }else u1_printf("关闭透传成功\r\n"); //串口提示数据
  42. u1_printf("准备关闭多路连接\r\n"); //串口提示数据
  43. if(WiFi_SendCmd("AT+CIPMUX=0",50)){ //关闭多路连接,100ms超时单位,总计5s超时时间
  44. u1_printf("关闭多路连接失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据
  45. return 6; //返回6
  46. }else u1_printf("关闭多路连接成功\r\n"); //串口提示数据
  47. Connect:
  48. u1_printf("准备连接服务器\r\n"); //串口提示数据
  49. res = WiFi_Connect_Server(100); //连接服务器,100ms超时单位,总计10s超时时间
  50. if(res==1){ //返回值=1,进入if
  51. u1_printf("服务器未开启,准备重连\r\n"); //串口提示数据
  52. Delay_Ms(2000); //延时
  53. goto Connect; //跳转到Connect重连
  54. }else if(res==2){ //返回值=2,进入if
  55. u1_printf("连接已经存在\r\n"); //串口提示数据
  56. }else if(res==3){ //返回值=3,进入if
  57. u1_printf("连接服务器超时,准备重连\r\n"); //串口提示数据
  58. return 7; //返回7
  59. }else if(res==4){ //返回值=4,进入if
  60. u1_printf("进入透传失败\r\n"); //串口提示数据
  61. return 8; //返回8
  62. }
  63. u1_printf("连接服务器成功\r\n"); //串口提示数据
  64. return 0; //正确返回0
  65. }

AT+CIPSTART

  1. /*-------------------------------------------------*/
  2. /*函数名:连接TCP服务器,并进入透传模式 */
  3. /*参 数:timeout: 超时时间(100ms的倍数) */
  4. /*返回值:0:正确 其他:错误 */
  5. /*-------------------------------------------------*/
  6. char WiFi_Connect_Server(int timeout)
  7. {
  8. WiFi_RxCounter=0; //WiFi接收数据量变量清零
  9. memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空WiFi接收缓冲区
  10. WiFi_printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ServerIP,ServerPort);//发送连接服务器指令
  11. while(timeout--){ //等待超时与否
  12. Delay_Ms(100); //延时100ms
  13. if(strstr(WiFi_RX_BUF ,"CONNECT")) //如果接受到CONNECT表示连接成功
  14. break; //跳出while循环
  15. if(strstr(WiFi_RX_BUF ,"CLOSED")) //如果接受到CLOSED表示服务器未开启
  16. return 1; //服务器未开启返回1
  17. if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED"))//如果接受到ALREADY CONNECTED已经建立连接
  18. return 2; //已经建立连接返回2
  19. u1_printf("%d ",timeout); //串口输出现在的超时时间
  20. }
  21. u1_printf("\r\n"); //串口输出信息
  22. if(timeout<=0)return 3; //超时错误,返回3
  23. else //连接成功,准备进入透传
  24. {
  25. u1_printf("准备进入透传\r\n"); //串口显示信息
  26. WiFi_RxCounter=0; //WiFi接收数据量变量清零
  27. memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空WiFi接收缓冲区
  28. WiFi_printf("AT+CIPSEND\r\n"); //发送进入透传指令
  29. while(timeout--){ //等待超时与否
  30. Delay_Ms(100); //延时100ms
  31. if(strstr(WiFi_RX_BUF,"\r\nOK\r\n\r\n>")) //如果成立表示进入透传成功
  32. break; //跳出while循环
  33. u1_printf("%d ",timeout); //串口输出现在的超时时间
  34. }
  35. if(timeout<=0)return 4; //透传超时错误,返回4
  36. }
  37. return 0; //成功返回0
  38. }

image.png
WiFi_Connect_Server()函数中
WiFi_printf(“AT+CIPSTART=\”TCP\”,\”%s\”,%d\r\n”,ServerIP,ServerPort);//发送连接服务器指令
/ 根据自己的网络环境修改 /
/——————————————————————————————————————-/
char ServerIP = “192.168.10.2”; //存放服务器IP或是域名
int ServerPort = 5050; //存放服务器的端口号区
/
——————————————————————————————————————-*/

AT+CIPSEND

2.STA模式客户端 - 图4

2.STA模式客户端 - 图5