OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3901|回复: 4

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

[复制链接]

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2018-7-25
在线时间
15 小时
发表于 2019-4-11 23:40:49 | 显示全部楼层 |阅读模式
10金钱
情况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最小系统板。
2.png
1.png

最佳答案

查看完整内容[请看2#楼]

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); 试试 任何发送前必须要判断发送是否为空,为空发送数据,不为空等待为空,再发送数据
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

17

主题

587

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4467
金钱
4467
注册时间
2013-6-27
在线时间
565 小时
发表于 2019-4-11 23:40:50 | 显示全部楼层
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);
试试
任何发送前必须要判断发送是否为空,为空发送数据,不为空等待为空,再发送数据
让我们的思维驾驭在电的速度之上!
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2018-7-25
在线时间
15 小时
 楼主| 发表于 2019-4-12 13:06:48 | 显示全部楼层
DongInker 发表于 2019-4-12 08:25
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ...

但是为什么没有发出去呢
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2018-7-25
在线时间
15 小时
 楼主| 发表于 2019-4-12 14:07:20 | 显示全部楼层
DongInker 发表于 2019-4-11 23:40
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ...

大概知道这怎么回事了
回复

使用道具 举报

5

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
110
金钱
110
注册时间
2018-7-25
在线时间
15 小时
 楼主| 发表于 2019-4-12 14:07:58 | 显示全部楼层
DongInker 发表于 2019-4-11 23:40
USART_SendData(USART2,(uint16_t) sdat);
while(USART_GetFlagStatus(USART2, USART_FLAG_TXE) == RESET) ...

谢谢           
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-22 15:55

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表