OpenEdv-开源电子网

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

串口中断发送数组问题

[复制链接]

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
发表于 2013-8-29 15:00:01 | 显示全部楼层 |阅读模式

#ifdef EN_USART2_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误    
u8 USART2_RX_BUF[16];     //接收缓冲,
u8 USART2_TX_BUF[16];

static u8 USART2_RX_STA=0;       //接收状态标记  
static u8 USART2_TX_STA=0; 
void USART2_IRQHandler(void)
{
  
 if(USART2->SR&(1<<5))//接收到数据
 { 
  USART2_RX_BUF[USART2_RX_STA++]=USART2->DR;
  if(USART2_RX_STA==16)//接收完成
  {    
    memcpy((void*)USART2_TX_BUF,(void*)USART2_RX_BUF,sizeof(USART2_RX_BUF));
    USART2_RX_STA=0;    
    USART2_TX_STA=0;
    USART2->CR1|=1<<7; 
  }
                   
 }
 
 if(USART2->SR&(1<<7))
 {
 
  USART2->DR=USART2_TX_BUF[USART2_TX_STA++];
  if(USART2_TX_STA==16)
  {USART2->CR1&=0<<7;
  }
 }            
}
#endif          
//
void uart2_init(u32 pclk2,u32 bound)
{   
 float temp;
 u16 mantissa;
 u16 fraction;   
 temp=(float)(pclk2*1000000)/(bound*16);//得到USARTDIV
 mantissa=temp;     //得到整数部分
 fraction=(temp-mantissa)*16; //得到小数部分 
    mantissa<<=4;
 mantissa+=fraction;
 RCC->APB2ENR|=1<<2;   //使能PORTA口时钟 
 RCC->APB1ENR|=1<<17;  //使能串口时钟
// GPIOA->CRH=0X444444B4;//IO状态设置
   
 RCC->APB1RSTR|=1<<17;   //复位串口1
 RCC->APB1RSTR&=~(1<<17);//停止复位       
 //波特率设置
  USART2->BRR=mantissa; // 波特率设置 
 USART2->CR1|=0X200C;  //1位停止,无校验位.
#ifdef EN_USART2_RX    //如果使能了接收
 //使能接收中断
 USART2->CR1|=1<<8;    //PE中断使能
 
 USART2->CR1|=1<<5;    //接收缓冲区非空中断使能      
 MY_NVIC_Init(3,3,USART2_IRQChannel,2);//组2,最低优先级
#endif
}
串口调试助手周期发送16个数据FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF,但是只接收到一帧数据如下:
FE//调试助手接收到的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手接收到的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
后面就接收不到数了,高手帮我看看什么缘故,谢谢。

再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
 楼主| 发表于 2013-8-29 15:04:44 | 显示全部楼层
刚才调试助手里的数据贴的有问题,改正一下,
串口调试助手周期发送16个数据FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF,但是只接收到一帧数据如下:
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
FE//调试助手接收到的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手接收到的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
FA 11 22 33 44 55 66 77 88 99 AA BB CC DD EE FF//调试助手发送的数据
后面就接收不到数了,高手帮我看看什么缘故,谢谢。
再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-29 15:28:22 | 显示全部楼层
串口问题,仿真即可解决。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
 楼主| 发表于 2013-8-29 15:41:22 | 显示全部楼层
谁帮我看看啊,原子在不在啊,帮我看看
再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
 楼主| 发表于 2013-8-29 15:41:47 | 显示全部楼层
我就是仿真的啊
再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
 楼主| 发表于 2013-8-29 16:56:55 | 显示全部楼层
,在这里一回复【楼主位】ceiba9:
---------------------------------
我找到问题了,是中断里这一句USART2->CR1&=0<<7;的缘故,为什么不知道
再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-29 19:35:28 | 显示全部楼层
回复【6楼】ceiba9:
---------------------------------
你这是全设置为0了。。。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

7

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
102
金钱
102
注册时间
2013-8-20
在线时间
7 小时
 楼主| 发表于 2013-8-30 16:34:35 | 显示全部楼层
 还真是这么回事,谢谢。
再烦,也别忘记微笑;再急,也要注意语气;再苦,也别忘记坚持;再累,也要爱自己。
回复 支持 反对

使用道具 举报

0

主题

7

帖子

0

精华

新手上路

积分
27
金钱
27
注册时间
2014-6-11
在线时间
0 小时
发表于 2014-6-13 21:18:34 | 显示全部楼层
回复【3楼】正点原子:
---------------------------------
u8 USART_RX_BUF[64];  
u8 USART_RX_STA=0;
void USART1_IRQHandler(void)
{
u8 Res;
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)//判断是否是接收中断
{
USART_ClearITPendingBit(USART2,USART_IT_RXNE);  
Res =USART_ReceiveData(USART1);//(USART1->DR); //读取接收到的数据
USART_RX_BUF[USART_RX_STA++]=Res;
if((USART_RX_BUF[0]=='A')&(USART_RX_BUF[1]=='T')&(USART_RX_BUF[2]=='0')) printf("aa");
if((USART_RX_BUF[0]=='A')&(USART_RX_BUF[1]=='T')&(USART_RX_BUF[2]=='1')) printf("BB");
   
}
}
原子哥,为什么第一次接受AT0,能发aa.第二次接受AT1,依旧发aa,不发BB啊?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-13 22:40:40 | 显示全部楼层
回复【9楼】wang123:
---------------------------------
因为你没有把第一次的数据清掉
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-6-13 22:40:55 | 显示全部楼层
也没看到你对USART_RX_STA清零.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

8

主题

14

帖子

0

精华

初级会员

Rank: 2

积分
67
金钱
67
注册时间
2015-3-21
在线时间
0 小时
发表于 2015-8-3 16:11:25 | 显示全部楼层
回复【10楼】正点原子:
---------------------------------
怎么把第一次的数据清掉呢?
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-8-3 22:38:30 | 显示全部楼层
回复【12楼】high小还:
---------------------------------
USART_RX_STA=0即可。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-19 00:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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