在中断中往串口发送了两次数据,但是只发送了一次,为什么呢

2019-07-21 03:03发布

情况1:
void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        u8 Res;       
        static u8 L_Res;                        //Res 本次接收数据,L_Res 上次接收的数据
        Res = USART_ReceiveData(USART2);    //接收数据
        USART_SendData(USART2,(uint16_t) Res);     //发送数据(发送成功)

        if(Res == 0xBB)
        {
                if(L_Res == 0xAA)
                {
                        STA_START_U1 = 1;                //状态标志位
                        C_sentbyte(Res);                 //发送数据(未能发送成功,但是却经过此段程序)
                }
        }
        L_Res = Res;                //记录本次数据
}

void C_sentbyte(u8 sdat)                          //发送数据函数
{
        USART_SendData(USART2,(uint16_t) sdat);
        while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
}
情况1说明:USART_SendData(USART2,(uint16_t) Res);能正常发送,C_sentbyte(Res); 不能正常发送。

情况2:
void USART2_IRQHandler(void)                        //串口2中断服务程序
{
        u8 Res;       
        static u8 L_Res;                        //Res 本次接收数据,L_Res 上次接收的数据
        Res = USART_ReceiveData(USART2);
        //USART_SendData(USART2,(uint16_t) Res);
        if(Res == 0xBB)
        {
                if(L_Res == 0xAA)
                {
                        STA_START_U1 = 1;                //状态标志位
                        C_sentbyte(Res);
                }
        }
        L_Res = Res;                //记录本次数据
}
情况2说明:当注释掉USART_SendData(USART2,(uint16_t) Res)后,C_sentbyte(Res)能正常发送。

程序描述:本段程序作用是检测发送过来的数据为0xaa,0xbb时,改变状态标志位,完成其他功能。
               但是在测试过程中发现检测返回的数据有未发送的,状态位能正常改变,百思不得其解,望解答
               本次使用的是STM32F103C8T6最小系统板。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
DongInker
1楼-- · 2019-07-21 04:45
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
改为
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET);
USART_SendData(USART2,(uint16_t) sdat);
试试
任何发送前必须要判断发送是否为空,为空发送数据,不为空等待为空,再发送数据
很多的地方
2楼-- · 2019-07-21 09:17
 精彩回答 2  元偷偷看……
很多的地方
3楼-- · 2019-07-21 11:44
DongInker 发表于 2019-4-11 23:40
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ...

大概知道这怎么回事了
很多的地方
4楼-- · 2019-07-21 12:45
DongInker 发表于 2019-4-11 23:40
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ...

谢谢           

一周热门 更多>