while(1) { if(USART_RX_STA&0x8000)//接受到任意数据即对LED1取反,并在端口显示 { len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度 printf("您发送的消息为: "); for(t=0;t<len;t++) { USART_SendData(USART1, USART_RX_BUF[t]);//向串口1发送数据 while(USART_GetFlagStatus(USART1,USART_FLAG_TC)!=SET);//等待发送结束 } switch(USART_RX_BUF[0]) { case 'OF':LED1=1;printf("您发送的消息为:1");break; case '2':LED2=1;printf("您发送的消息为:2");break; case 'CF':LED1=0;printf("您发送的消息为:3");break; case '4':LED2=0;break; case '5':LED1=0;LED2=0;break; case '6':LED1=1;LED2=1;break; case '7': arr=1000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=300; TIM_SetCompare2(TIM2,ccr); flag=0; break; case '8' : arr=2000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=1400; TIM_SetCompare2(TIM2,ccr); flag=0; break; case '9': arr=3000; TIM2_PWM_Init(arr-1,7199);//按键1按下周期减少 ccr=3000; TIM_SetCompare2(TIM2,ccr); flag=0; break; } } for(flag=0;flag<500;flag){ if(flag<250) { u8DispBuf[1]=0; u8DispBuf[2]=0; u8DispBuf[3]=0; u8DispBuf[4]=arr/1000;//周期显示 } else { u8DispBuf[1]=0; u8DispBuf[2]=0; u8DispBuf[3]=(ccr*100/arr)/10; u8DispBuf[4]=(ccr*100/arr) %10; //高电平时间显示 } DispUpdate(); flag++; } }为什么Switch语句中的代码无法正常执行
时间: 2023-10-29 10:07:00 浏览: 94
根据代码的结构和注释,这段代码是一个死循环,主要是通过串口接收数据并进行处理。在 Switch 语句中,根据接收到的数据进行不同的操作,包括控制 LED 灯的亮灭和定时器的设置。
但是,从代码中并没有看到与定时器相关的初始化和开启操作。在 Switch 语句中,设置了不同的定时器参数,但是没有对定时器进行初始化和开启,因此无法正常执行。
另外,代码中的 for 循环中有一个错误,flag 变量没有进行自增操作,导致该循环会一直卡在里面,阻塞程序的正常执行。
相关问题
u8* esp8266_send_data(u8 cmd,u16 waittime) { char temp[5]; char ack=temp; USART2_RX_STA=0; u3_printf("%s",cmd); //发送命令 if(waittime) //需要等待应答 { while(--waittime) //等待倒计时 { delay_ms(10); if(USART2_RX_STA&0X8000)//接收到期待的应答结果 { USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符 ack=(char)USART2_RX_BUF; printf("ack:%s\r\n",(u8)ack); USART2_RX_STA=0; break;//得到有效数据 } } } return (u8*)ack; }
这段代码是用于在 ESP8266 模块上发送数据的函数。具体来说,它会向模块发送一个命令(即参数 cmd),然后等待一段时间(即参数 waittime)来接收模块的应答结果。如果在等待时间内接收到了期待的应答结果,那么函数会返回应答结果的字符串形式(即变量 ack)。如果等待时间结束时还没有收到应答结果,那么函数会返回一个空字符串。
该函数使用了串口通信来与 ESP8266 模块进行通信。其中,USART2_RX_STA 和 USART2_RX_BUF 用于接收模块的应答结果。函数中的 u3_printf() 和 printf() 函数用于向串口发送数据和打印调试信息。delay_ms() 函数用于延时一段时间。
u8* esp8266_send_data(u8 *cmd,u16 waittime) { char temp[5]; char *ack=temp; USART2_RX_STA=0; u3_printf("%s",cmd); //发送命令 if(waittime) //需要等待应答 { while(--waittime) //等待倒计时 { delay_ms(10); if(USART2_RX_STA&0X8000)//接收到期待的应答结果 { USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符 ack=(char*)USART2_RX_BUF; printf("ack:%s\r\n",(u8*)ack); USART2_RX_STA=0; break;//得到有效数据 } } } return (u8*)ack; }
这是一段 ESP8266 模块发送数据并等待应答的代码。它通过 USART2 发送命令,然后等待一定时间,如果接收到期待的应答结果,则返回应答内容,否则返回一个指向 temp 数组的指针。其中,USART2_RX_STA 是一个状态寄存器,用于记录接收状态。当接收到数据时,会把数据保存在 USART2_RX_BUF 数组中,并将接收状态保存在 USART2_RX_STA 寄存器中。如果接收到期待的应答结果,则将 USART2_RX_BUF 数组中的数据赋给 ack 变量,并返回指向 ack 变量的指针。
阅读全文