客户端参数
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溢出中断,进入if
Usart2_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,进入if
u1_printf("服务器未开启,准备重连\r\n"); //串口提示数据
Delay_Ms(2000); //延时
goto Connect; //跳转到Connect重连
}else if(res==2){ //返回值=2,进入if
u1_printf("连接已经存在\r\n"); //串口提示数据
}else if(res==3){ //返回值=3,进入if
u1_printf("连接服务器超时,准备重连\r\n"); //串口提示数据
return 7; //返回7
}else if(res==4){ //返回值=4,进入if
u1_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); //延时100ms
if(strstr(WiFi_RX_BUF ,"CONNECT")) //如果接受到CONNECT表示连接成功
break; //跳出while循环
if(strstr(WiFi_RX_BUF ,"CLOSED")) //如果接受到CLOSED表示服务器未开启
return 1; //服务器未开启返回1
if(strstr(WiFi_RX_BUF ,"ALREADY CONNECTED"))//如果接受到ALREADY CONNECTED已经建立连接
return 2; //已经建立连接返回2
u1_printf("%d ",timeout); //串口输出现在的超时时间
}
u1_printf("\r\n"); //串口输出信息
if(timeout<=0)return 3; //超时错误,返回3
else //连接成功,准备进入透传
{
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); //延时100ms
if(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; //存放服务器的端口号区
/——————————————————————————————————————-*/