ARM技术william hill官网
直播中

flyhung

9年用户 31经验值
擅长:接口/总线/驱动 控制/MCU
私信 关注
[问答]

STM32的UART5中断收发数据问题

波特率是9600
void UART5_IRQHandler(void)
{
         u8 res;               
         //if(USART_GetFlagStatus(UART5, USART_FLAG_RXNE)!=RESET)
         if(USART_GetiTStatus(UART5, USART_IT_RXNE) != RESET)//接收到数据中断,(接收到的数据必须是0x0d 0x0a结尾)
         {               
                 res =USART_ReceiveData(UART5);//读取到收到的数据        
                 if(UART5_RX_STA                 {
                         TIM_SetCounter(TIM3,0);//计数器清空                                         
                         if(UART5_RX_STA==0)TIM3_Set(1);                 //使能定时器3的中断
                        UART5_RX_BUF[UART5_RX_STA++]=res;                //记录接收到的值                                 
                 }else
                 {
                         UART5_RX_STA|=1<<15;                                        //强制标记接收完成
                }         
          }        
}

采用的是循环发送数据方式:
/**************************************************
   UART5发送一个字节
**************************************************/
void UART5_Tx_Char(u8 i)
{
     USART_SendData(UART5,i); //发往WIFI模块
        while(USART_GetFlagStatus(UART5, USART_FLAG_TXE)==RESET);
}  
/*******************************************
UART5发送字符串
*******************************************/
void UART5_Tx_Str(u8 *pt, u8 length)
{   
         u8 i;
         for( i=0;i          UART5_Tx_Char(*pt++);        
         //printf("rnUART5_test_2:rn",USART_ReceiveData(UART5));
    }        
    //delay_ms(500);
}  

UART5发送数据没有问题,但是接受数据时,平均每10次有两次会收不到数据,这是为什么?
(UART5<=>WIFI,手册技术支持上WIFI波特率115200,但是我试过115200,收发数据根本不行,9600恰好可以)

也就是说,当状态值UART5_RX_STA为数组最大缓存值时,接收数据时正确的,如果小于数组最大缓存值,则收不到数据,或者接收数据不完全

回帖(4)

flyhung

2015-5-12 22:50:34
问题已经解决,我忘记在U5串口中断里加清除中断函数了,还有我的我的逻辑也有些问题
USART_ClearITPendingBit(USART_TypeDef* USARTx, u16 USART_IT);
USART_ClearFlag(USART_TypeDef* USARTx, u16 USART_FLAG);
举报

h1654155885.6488

2015-5-16 15:47:52
解决就好,,,,,,,,,,
举报

黄洪文

2016-4-19 12:20:04
大神,我现在用定时器超时接收一帧数据老是不行,能分享程序给我看看嘛?邮箱,1179083830@qq.com
举报

黄洪文

2016-4-19 12:22:38
引用: luck_fuwei 发表于 2015-5-16 15:47
解决就好,,,,,,,,,,

void Rec_data_buf(void)//用于发生接收中断,函数功能:接收一帧数据存到结构体成员接收款冲里面,记录接收数据个数
{
        u8 dat;
        static int i = 0;       
        if(USART1->SR &(1<<5))    //收到数据,可以读出,读数据寄存器非空
        {               
                dat = RecData();       
                uart1.RS485_RX_BUF[i++] = dat;                               
//                if(dat!=0x00)
                if(!Modbus_Data_Over_Flag)  //MODBUS协议接收数据帧结束标志,帧间隔,modbus标准是3.5-4ms
                {                                 
                                TIM2->CR1|=1<<0;    //使能计数器       
                                TIM2->CNT &= 0x00;                        //这里是向上计数器清零
                                       
                }
                else
                {                       
                        uart1.RS485_RX_CNT = i;     //记录接收到的数据个数;               
                        RS485_Rec_Over_flag = 1;    //主函数判断接收完成标志                                       
                        Modbus_Data_Over_Flag =0;          //协议帧标志清零
                        i = 0;                       
                }
        }
}

我这个为什么不行啊
举报

更多回帖

发帖
×
20
完善资料,
赚取积分