客户端参数
main.c
串口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配合,
串口中断程序
服务器的中断程序
客户端的串口中断程序
/*-------------------------------------------------*//*函数名:串口2接收中断函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/void USART2_IRQHandler(void){if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET){ //如果USART_IT_RXNE标志置位,表示有数据到了,进入if分支if(Connect_flag==0){ //如果Connect_flag等于0,当前还没有连接服务器,处于指令配置状态if(USART2->DR){ //处于指令配置状态时,非零值才保存到缓冲区Usart2_RxBuff[Usart2_RxCounter]=USART2->DR; //保存到缓冲区Usart2_RxCounter ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1}}else{ //反之Connect_flag等于1,连接上服务器了Usart2_RxBuff[Usart2_RxCounter] = USART2->DR; //把接收到的数据保存到Usart2_RxBuff中if(Usart2_RxCounter == 0){ //如果Usart2_RxCounter等于0,表示是接收的第1个数据,进入if分支TIM_Cmd(TIM4,ENABLE);}else{ //else分支,表示果Usart2_RxCounter不等于0,不是接收的第一个数据TIM_SetCounter(TIM4,0);}Usart2_RxCounter ++; //每接收1个字节的数据,Usart2_RxCounter加1,表示接收的数据总量+1}}}}
如果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计时器及其中断。
/*-------------------------------------------------*//*函数名:定时器4中断服务函数 *//*参 数:无 *//*返回值:无 *//*-------------------------------------------------*/void TIM4_IRQHandler(void){if(TIM_GetITStatus(TIM4, TIM_IT_Update) != RESET){ //如果TIM_IT_Update置位,表示TIM4溢出中断,进入ifUsart2_RxCompleted = 1; //串口2接收完成标志位置位memcpy(&Data_buff[2],Usart2_RxBuff,Usart2_RxCounter); //拷贝数据Data_buff[0] = WiFi_RxCounter/256; //记录接收的数据量Data_buff[1] = WiFi_RxCounter%256; //记录接收的数据量Data_buff[WiFi_RxCounter+2] = '\0'; //加入结束符WiFi_RxCounter=0; //清零计数值TIM_Cmd(TIM4, DISABLE); //关闭TIM4定时器TIM_SetCounter(TIM4, 0); //清零定时器4计数器TIM_ClearITPendingBit(TIM4, TIM_IT_Update); //清除TIM4溢出中断标志}}
连接到服务器
/*-------------------------------------------------*//*函数名:连接服务器 *//*参 数:无 *//*返回值:0:正确 其他:错误 *//*-------------------------------------------------*/char WiFi_ConnectServer_AP(void){char res;char temp[50];u1_printf("准备复位模块\r\n"); //串口提示数据if(WiFi_Reset(50)){ //复位,100ms超时单位,总计5s超时时间u1_printf("复位失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 1; //返回1}else u1_printf("复位成功\r\n"); //串口提示数据u1_printf("准备设置AP模式\r\n"); //串口提示数据if(WiFi_SendCmd("AT+CWMODE=2",50)){ //设置AP模式,100ms超时单位,总计5s超时时间u1_printf("设置AP模式失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 2; //返回2}else u1_printf("设置AP模式成功\r\n"); //串口提示数据u1_printf("准备设置AP参数\r\n"); //串口提示数据u1_printf("SSID:%s\r\n",SSID); //串口提示数据u1_printf("密码:%s\r\n",PASS); //串口提示数据u1_printf("AP热点IP:%s\r\n",AP_IP); //串口提示数据u1_printf("加密方式:WPA_WPA2_PSK\r\n"); //串口提示数据u1_printf("准备设置AP热点IP\r\n"); //串口提示数据memset(temp,0,50); //清除临时缓冲区sprintf(temp,"AT+CIPAP=\"%s\"",AP_IP); //构建命令if(WiFi_SendCmd(temp,50)){ //设置AP热点IP,100ms超时单位,总计5s超时时间u1_printf("设置AP热点IP失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 3; //返回3}else u1_printf("设置AP热点IP成功\r\n"); //串口提示数据u1_printf("准备设置AP参数\r\n"); //串口提示数据if(WiFi_SET_AP(SSID,PASS,WPA_WPA2_PSK,50)){ //设置AP参数,100ms超时单位,总计5s超时时间u1_printf("设置AP参数失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 4; //返回4}else u1_printf("设置AP参数成功\r\n"); //串口提示数据u1_printf("准备开启透传\r\n"); //串口提示数据if(WiFi_SendCmd("AT+CIPMODE=1",50)){ //开启透传,100ms超时单位,总计5s超时时间u1_printf("开启透传失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 5; //返回5}else u1_printf("关闭透传成功\r\n"); //串口提示数据u1_printf("准备关闭多路连接\r\n"); //串口提示数据if(WiFi_SendCmd("AT+CIPMUX=0",50)){ //关闭多路连接,100ms超时单位,总计5s超时时间u1_printf("关闭多路连接失败,准备重启\r\n"); //返回非0值,进入if,串口提示数据return 6; //返回6}else u1_printf("关闭多路连接成功\r\n"); //串口提示数据Connect:u1_printf("准备连接服务器\r\n"); //串口提示数据res = WiFi_Connect_Server(100); //连接服务器,100ms超时单位,总计10s超时时间if(res==1){ //返回值=1,进入ifu1_printf("服务器未开启,准备重连\r\n"); //串口提示数据Delay_Ms(2000); //延时goto Connect; //跳转到Connect重连}else if(res==2){ //返回值=2,进入ifu1_printf("连接已经存在\r\n"); //串口提示数据}else if(res==3){ //返回值=3,进入ifu1_printf("连接服务器超时,准备重连\r\n"); //串口提示数据return 7; //返回7}else if(res==4){ //返回值=4,进入ifu1_printf("进入透传失败\r\n"); //串口提示数据return 8; //返回8}u1_printf("连接服务器成功\r\n"); //串口提示数据return 0; //正确返回0}
AT+CIPSTART
/*-------------------------------------------------*//*函数名:连接TCP服务器,并进入透传模式 *//*参 数:timeout: 超时时间(100ms的倍数) *//*返回值:0:正确 其他:错误 *//*-------------------------------------------------*/char WiFi_Connect_Server(int timeout){WiFi_RxCounter=0; //WiFi接收数据量变量清零memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空WiFi接收缓冲区WiFi_printf("AT+CIPSTART=\"TCP\",\"%s\",%d\r\n",ServerIP,ServerPort);//发送连接服务器指令while(timeout--){ //等待超时与否Delay_Ms(100); //延时100msif(strstr(WiFi_RX_BUF ,"CONNECT")) //如果接受到CONNECT表示连接成功break; //跳出while循环if(strstr(WiFi_RX_BUF ,"CLOSED")) //如果接受到CLOSED表示服务器未开启return 1; //服务器未开启返回1if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED"))//如果接受到ALREADY CONNECTED已经建立连接return 2; //已经建立连接返回2u1_printf("%d ",timeout); //串口输出现在的超时时间}u1_printf("\r\n"); //串口输出信息if(timeout<=0)return 3; //超时错误,返回3else //连接成功,准备进入透传{u1_printf("准备进入透传\r\n"); //串口显示信息WiFi_RxCounter=0; //WiFi接收数据量变量清零memset(WiFi_RX_BUF,0,WiFi_RXBUFF_SIZE); //清空WiFi接收缓冲区WiFi_printf("AT+CIPSEND\r\n"); //发送进入透传指令while(timeout--){ //等待超时与否Delay_Ms(100); //延时100msif(strstr(WiFi_RX_BUF,"\r\nOK\r\n\r\n>")) //如果成立表示进入透传成功break; //跳出while循环u1_printf("%d ",timeout); //串口输出现在的超时时间}if(timeout<=0)return 4; //透传超时错误,返回4}return 0; //成功返回0}

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


