打印

程序怎样才能跳出for循环

[复制链接]
3342|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
daliny|  楼主 | 2011-3-1 17:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
我使用st公司的三合一板和一个触摸屏进行串口通信,通信方式为中断接收、查询发送,现在通信的接收和发送都可以进行了,传输的数据都正确,但在主程序里却无法看到接收中断接收的数据。通过设置断点发现主程序除了响应中断以外,就一直停在主程序内的一个for循环的while语句上不再移动。可以响应接收中断,但不响应我在主程序里设置的断点,用halt停止程序运行,黄色箭头都停在while(USART_GetFlagStatus(USART1,   USART_FLAG_TXE)==RESET);可见程序一直没有跳出这个for循环。我试了好长时间,一直没有进展。下面是程序在MDK里运行的拷屏,请各位高手和朋友给予帮助和指点。
沙发
lgymilu| | 2011-3-2 10:16 | 只看该作者
会不会是while语句有问题?

使用特权

评论回复
板凳
香水城| | 2011-3-2 10:23 | 只看该作者
可以看看当黄色箭头都停在while时,变量i的数值是多少,对应的数据是否已经发送成功?

使用特权

评论回复
地板
zhanglili1111| | 2011-3-2 14:08 | 只看该作者
楼上说的对的,要看看中间变量

使用特权

评论回复
5
daliny|  楼主 | 2011-3-2 14:37 | 只看该作者
谢谢!我试了一下,黄色箭头都停在while时,变量i的数值是0x28,我也是第一次使用MDK,不知道这个i值代表的什么意思,对应的数据,理论上应该发送完毕了,如果没有发送完毕,触摸屏的数据格式不满足,就不能正确显示,现在触摸屏显示正常。但串口数据寄存器DR(0x40013804)的内容为3C,这是发送数据最后一个字节的内容。为什么它还有内容呢?

使用特权

评论回复
6
daliny|  楼主 | 2011-3-2 14:45 | 只看该作者
这个黄色箭头有时也会停在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;
}

使用特权

评论回复
7
daliny|  楼主 | 2011-3-2 16:02 | 只看该作者
现在我把主程序的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)
  {
  }
}
真是硬件有问题吗?但是在主程序里不添加读取接收中断数据的数据就可以正常运行,到底是硬件问题,还是软件不对呢?
非常期望各位高手和朋友给予指点和帮助!
谢谢!非常感谢!拜托了!

使用特权

评论回复
8
daliny|  楼主 | 2011-3-2 16:09 | 只看该作者
在主程序里不添加读取接收中断数据的(数据)就可以正常运行
上面数据两字写错了,应改为语句二字即
在主程序里不添加读取接收中断数据的语句就可以正常运行

使用特权

评论回复
9
daliny|  楼主 | 2011-3-3 18:20 | 只看该作者
问题找到了,在主程序里少了一个while (1)语句,程序跑飞了,增加该语句后,就一切正常了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

9

主题

25

帖子

1

粉丝