程序怎样才能跳出for循环

szhgx26   2011-3-1 17:33 楼主
我使用st公司的三合一板和一个触摸屏进行串口通信,通信方式为中断接收、查询发送,现在通信的接收和发送都可以进行了,传输的数据都正确,但在主程序里却无法看到接收中断接收的数据。通过设置断点发现主程序除了响应中断以外,就一直停在主程序内的一个for循环的while语句上不再移动。可以响应接收中断,但不响应我在主程序里设置的断点,用halt停止程序运行,黄色箭头都停在while(USART_GetFlagStatus(USART1,   USART_FLAG_TXE)==RESET);可见程序一直没有跳出这个for循环。我试了好长时间,一直没有进展。下面是程序在MDK里运行的拷屏,请各位高手和朋友给予帮助和指点。

回复评论 (7)

                                 会不会是while语句有问题?
点赞  2011-3-2 10:16
                                 楼上说的对的,要看看中间变量
点赞  2011-3-2 14:08
谢谢!我试了一下,黄色箭头都停在while时,变量i的数值是0x28,我也是第一次使用MDK,不知道这个i值代表的什么意思,对应的数据,理论上应该发送完毕了,如果没有发送完毕,触摸屏的数据格式不满足,就不能正确显示,现在触摸屏显示正常。但串口数据寄存器DR(0x40013804)的内容为3C,这是发送数据最后一个字节的内容。为什么它还有内容呢?
点赞  2011-3-2 14:37
这个黄色箭头有时也会停在usart.c文件的USART_GetFlagStatus函数里
FlagStatus USART_GetFlagStatus(USART_TypeDef* USARTx, u16 USART_FLAG)
{
  FlagStatus bitstatus = RESET;
  
  /* Check the parameters */
  assert_param(IS_USART_FLAG(USART_FLAG));
  
  if ((USARTx->SR & USART_FLAG) != (u16)RESET)
  {
    bitstatus = SET;
  }
  else
  {
    bitstatus = RESET;
  }
  return bitstatus;
}
点赞  2011-3-2 14:45
现在我把主程序的for循环取消,通信的接收和发送都使用中断进行,在接收中断,接收数据完成后,点亮接收指示灯,然后在主程序里经过延时再把接收指示灯熄灭。
    程序运行后,程序可以接收触摸屏传送的键码信息,然后直接通过发送中断把键码信息发回触摸屏显示,键码显示正确。对应的接收指示灯也会闪亮。
     但如果在主程序里增加读取接收中断数据的语句,程序就不再响应通信中断了,也不在主程序里运行,在这两个地方设置断点都没有响应。如果按halt停止程序运行,发现指示程序运行的黄色箭头(使用MDK编译、调试),每次都停it.c文件的 HardFaultException函数的while (1)语句上。
/*******************************************************************************
* Function Name  : HardFaultException
* Description    : This function handles Hard Fault exception.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void HardFaultException(void)
{
  /* Go to infinite loop when Hard Fault exception occurs */
  while (1)
  {
  }
}
真是硬件有问题吗?但是在主程序里不添加读取接收中断数据的数据就可以正常运行,到底是硬件问题,还是软件不对呢?
非常期望各位高手和朋友给予指点和帮助!
谢谢!非常感谢!拜托了!
点赞  2011-3-2 16:02
在主程序里不添加读取接收中断数据的(数据)就可以正常运行
上面数据两字写错了,应改为语句二字即
在主程序里不添加读取接收中断数据的语句就可以正常运行
点赞  2011-3-2 16:09
                                 问题找到了,在主程序里少了一个while (1)语句,程序跑飞了,增加该语句后,就一切正常了。
点赞  2011-3-3 18:20
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复