OpenEdv-开源电子网

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

串口发送中断问题

[复制链接]

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
发表于 2015-12-28 13:38:21 | 显示全部楼层 |阅读模式
1金钱
我用软件仿真没有问题,烧到单片机上总是最后一个字节不发
if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)         //发送数据寄存器空中断
        {                
                tx_num++;
                if(tx_num<tx_nums)
                {
                        USART_SendData(USART2,tx_dat[tx_num]);
                }
                else
                {
                        //while(USART2->SR&(1<<6));
                        tx_num=0; flag_systick_tx=1;
                        RS485_RX;
                        USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
                }
        }
        if(USART_GetITStatus(USART2,USART_IT_TC)!=RESET)
        {
                USART_ClearITPendingBit(USART2,USART_IT_TC);
                USART_ITConfig(USART2,USART_IT_TC,DISABLE);
               
        }



以上是中断函数,发送触发示意:
tx_dat[10]={1,2,3,4,5,6};
tx_num=0;tx_nums=5;

USART_SendData(USART2,tx_dat[0]);
USART_ITConfig(USART2,USART_IT_TXE,ENABLE);

应该发送 1 2 3 4 5 结果总是发到4就不发了 求助大神帮看

最佳答案

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

发送完成中断再使能接收[mw_shl_code=c,true]if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET) //发送数据寄存器空中断 { tx_num++; if(tx_numSR&(1
我有故事,你有酒吗
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-28 13:38:22 | 显示全部楼层
发送完成中断再使能接收[mw_shl_code=c,true]if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)         //发送数据寄存器空中断
        {                 
                tx_num++;
                if(tx_num<tx_nums)
                {
                        USART_SendData(USART2,tx_dat[tx_num]);
                }
                else
                {
                        //while(USART2->SR&(1<<6));
                        tx_num=0; flag_systick_tx=1;
                        
                        USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
                }
        }
        if(USART_GetITStatus(USART2,USART_IT_TC)!=RESET)
        {
                USART_ClearITPendingBit(USART2,USART_IT_TC);
                USART_ITConfig(USART2,USART_IT_TC,DISABLE);
                RS485_RX;
        }[/mw_shl_code]
回复

使用道具 举报

2

主题

391

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1957
金钱
1957
注册时间
2014-8-8
在线时间
307 小时
发表于 2015-12-28 13:42:28 | 显示全部楼层
发送完成中断再使能接收
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3772
金钱
3772
注册时间
2015-4-26
在线时间
765 小时
 楼主| 发表于 2015-12-28 13:52:08 | 显示全部楼层
365mcu 发表于 2015-12-28 13:38
发送完成中断再使能接收[mw_shl_code=c,true]if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)          ...

确实是这样的,非常感谢
我有故事,你有酒吗
回复

使用道具 举报

11

主题

127

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2013-7-14
在线时间
3 小时
发表于 2015-12-28 17:25:03 | 显示全部楼层
if(tx_num<tx_nums)   改成tx_nums+1 就好了  你的txnum每次先加1 比较时候 比原来本来就大了1
回复

使用道具 举报

7

主题

85

帖子

0

精华

初级会员

Rank: 2

积分
163
金钱
163
注册时间
2011-3-3
在线时间
12 小时
发表于 2015-12-28 18:49:43 | 显示全部楼层

我用软件仿真没有问题,烧到单片机上总是最后一个字节不发
if(USART_GetITStatus(USART2,USART_IT_TXE)!=RESET)         //发送数据寄存器空中断
        {                 
               
                if(tx_num<tx_nums)
                {
                        tx_num++;
                        USART_SendData(USART2,tx_dat[tx_num]);
                }
                else
                {
                        //while(USART2->SR&(1<<6));
                        tx_num=0; flag_systick_tx=1;
                        RS485_RX;
                        USART_ITConfig(USART2,USART_IT_TXE,DISABLE);
                }
        }
        if(USART_GetITStatus(USART2,USART_IT_TC)!=RESET)
        {
                USART_ClearITPendingBit(USART2,USART_IT_TC);
                USART_ITConfig(USART2,USART_IT_TC,DISABLE);
               
        }
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 20:54

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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