OpenEdv-开源电子网

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

最近写串口通信程序 接收10个数据后出去 就是不好使 求助各位坛友

[复制链接]

2

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-6
在线时间
8 小时
发表于 2018-4-13 21:24:35 | 显示全部楼层 |阅读模式
20金钱
下面是中断函数 请各位看看问题出在哪
void USART2_IRQHandler(void)
{
                   int i;                               
        static unsigned char counter=0;//接收十个数

   if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)                  //中断是否产生
   {
                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);
               RxBuffer[counter]=USART_ReceiveData(USART2);        //接收数据
         counter++;
                          if(counter>=10)
        counter=0;
  }
        for(i=0;i<10;i++)
  {
   USART_SendData(USART2,RxBuffer[i]);    //发送数据
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET);//判断是否发送完
  }
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

7

帖子

0

精华

新手入门

积分
14
金钱
14
注册时间
2018-4-6
在线时间
8 小时
 楼主| 发表于 2018-4-13 21:27:19 | 显示全部楼层
USART配置部分
void uart_init()
{
        GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);       
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);

   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_2;
   GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
   GPIO_Init(GPIOA,&GPIO_InitStructure);

   GPIO_InitStructure.GPIO_Pin=GPIO_Pin_3;
   GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;
   GPIO_Init(GPIOA,&GPIO_InitStructure);

   NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;                  
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   USART_InitStructure.USART_BaudRate=115200;
   USART_InitStructure.USART_WordLength=USART_WordLength_8b;
   USART_InitStructure.USART_StopBits=USART_StopBits_1;
   USART_InitStructure.USART_Parity=USART_Parity_No;
   USART_InitStructure.USART_Mode=USART_Mode_Rx|USART_Mode_Tx;
   USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;
   USART_Init(USART2,&USART_InitStructure);

   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);

   USART_Cmd(USART2,ENABLE);

//  USART_ClearFlag(USART2,USART_FLAG_TC);


}

回复

使用道具 举报

4

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-12-23
在线时间
18 小时
发表于 2018-4-13 22:55:20 | 显示全部楼层
void USART1_IRQHandler(void)                        //′&#174;&#191;ú1&#214;D&#182;&#207;·t&#206;&#241;3ìDò
        {
        u8 Res;
#if SYSTEM_SUPPORT_OS                 //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntEnter();   
#endif
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)  //&#189;óê&#213;&#214;D&#182;&#207;(&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y±&#216;D&#235;ê&#199;0x0d 0x0a&#189;á&#206;2)
                {
                Res =USART_ReceiveData(USART1);        //&#182;áè&#161;&#189;óê&#213;μ&#189;μ&#196;êy&#190;Y
               
                if((USART_RX_STA&0x8000)==0)//&#189;óê&#213;&#206;′íê3é
                        {
                        if(USART_RX_STA&0x4000)//&#189;óê&#213;μ&#189;á&#203;0x0d
                                {
                                if(Res!=0x0a)USART_RX_STA=0;//&#189;óê&#213;′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;
                                else USART_RX_STA|=0x8000;        //&#189;óê&#213;íê3éá&#203;
                                }
                        else //&#187;1&#195;&#187;ê&#213;μ&#189;0X0D
                                {       
                                if(Res==0x0d)USART_RX_STA|=0x4000;
                                else
                                        {
                                        USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//&#189;óê&#213;êy&#190;Y′í&#206;ó,&#214;&#216;D&#194;&#191;aê&#188;&#189;óê&#213;          
                                        }                 
                                }
                        }                    
     }
#if SYSTEM_SUPPORT_OS         //è&#231;1&#251;SYSTEM_SUPPORT_OS&#206;a&#213;&#230;£&#172;&#212;òDèòa&#214;§3&#214;OS.
        OSIntExit();                                                                                           
#endif
}
这是正点原子的程序,你参考一下
回复

使用道具 举报

51

主题

2166

帖子

2

精华

论坛元老

Rank: 8Rank: 8

积分
10653
金钱
10653
注册时间
2017-4-14
在线时间
2780 小时
发表于 2018-4-13 23:03:50 | 显示全部楼层
下面是中断函数 请各位看看问题出在哪
void USART2_IRQHandler(void)
{
                   int i,flag=0;                                
        static unsigned char counter=0;//接收十个数

   if(USART_GetITStatus(USART2,USART_IT_RXNE)==SET)                  //中断是否产生
   {
                 USART_ClearITPendingBit(USART2,USART_IT_RXNE);
               RxBuffer[counter]=USART_ReceiveData(USART2);        //接收数据
         counter++;
                          if(counter>=10){
        counter=0;
flag=1;
}
  }
if(flag==1)
{
        for(i=0;i<10;i++)
  {
   USART_SendData(USART2,RxBuffer);    //发送数据
   while(USART_GetFlagStatus(USART2,USART_FLAG_TC)== RESET);//判断是否发送完
  }
flag=0;
}
}

回复

使用道具 举报

10

主题

778

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6745
金钱
6745
注册时间
2017-4-12
在线时间
1258 小时
发表于 2018-4-14 11:40:31 | 显示全部楼层
最好把发送程序放主函数,接收完10个数,条件满足再发送,你现在放中断里,进一次中断就要发送了 ,加判断条件
回复

使用道具 举报

1

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2018-4-26
在线时间
7 小时
发表于 2018-4-26 17:18:59 | 显示全部楼层
题主串口使能的是接收中断,只有接收数据的时候才能进入中断。所以你的发送部分应该放在接收里面,而不是通过标志位验证再发送,这个步骤有点多余,并且再发送的时候应该关闭接收使能,发送完毕再开启使能。最好的话发送不要放在中断里面,把接收到的数据放在一个全局数组里,然后在主函数里面直接发送就行
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-9 23:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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