串口数据发送放在定时器中断中,导致死循环,程序出不来,500ms进一次定时器中断

2019-07-20 08:21发布

//定时器3中断 500ms进一次
void TIM3_IRQHandler(void)
{
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)//检查TIM3更新中断发生与否  
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update);// 清除TIM3更新中断标志
//                LED0 = !LED0;
                RS485_Send_Data(RS485_TX_BUF,8);

        }
}

//RS485发送len个字节.
//buf:发送区首地址
//len:发送的字节数(为了和本代码的接收匹配,这里建议不要超过64个字节)
void RS485_Send_Data(u8 *buf,u8 len)
{
        u8 t;
        RS485_TX_EN = 1;                        //设置为发送模式
          for(t=0; t<len; t++)                //循环发送数据
        {                       
                while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);        //程序死在这里,出不去!!!!!  
                USART_SendData(USART2,buf[t]);

        }         
        while(USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);//等待发送完成               
        RS485_RX_CNT = 0;          //数据长度清零
        RS485_TX_EN = 0;         //设置为接收模式               
}
程序在这里出不去:
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);        //程序死在这里,出不去!!!!!  
什么原因啊,RS485_Send_Data(RS485_TX_BUF,8);放在主循环中就没问题,把它放在定时器中断中就不可以,为什么?来个大神讲讲吧,小白一个,唉


友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
8条回答
风忆柔情
1楼-- · 2019-07-20 11:15
000自己顶一顶
风忆柔情
2楼-- · 2019-07-20 15:57
 精彩回答 2  元偷偷看……
风忆柔情
3楼-- · 2019-07-20 19:14
 精彩回答 2  元偷偷看……
HXYDJ
4楼-- · 2019-07-20 23:12
在定时器中设置一个标志位,定时时间到了置标志位,然后主程序中扫描标志位,根据标志位状态去发送数据。中断里面代码越短越好。
风忆柔情
5楼-- · 2019-07-20 23:52
 精彩回答 2  元偷偷看……
程序帅霸霸
6楼-- · 2019-07-21 05:36
中断的优先级设没。或者if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //接受数据必须是0x0d,0x0a结尾的

一周热门 更多>