微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 关于stm32的串口问题

关于stm32的串口问题

时间:10-02 整理:3721RD 点击:
我是用中断的形式进行串口通信的,我在别人的视频里看到有个写法是这样的,直接上图吧,看图,他的意思就是直接把单片机接收到的数据返回发给电脑,因此这里就没有调用重定向的printf函数了,我看视频里这样写是没问题的,串口调试的时候也是这样接收到和发送的数据一样,可是到了我的开发板上就不行了,我用的是野火的开发板,他的配套程序是这样的
void USART1_IRQHandler(void)
{
        u8 c;
        if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
        {        
            c=USART1->DR;
                  printf("%c",c);    //将接受到的数据直接返回打印
        }
}
就是调用了重定向的printf函数,当然开始就重定向了,只是我在想,这样写是可以的,知道的能帮忙回答下么,感激不尽。


不知道,顶一个

void USART1_IRQHandler(void)
{
        u8 res;            
        if(USART1->SR&(1<<5))//接收到数据
        {         
                res=USART1->DR;
                if((USART_RX_STA&0x80)==0)//接收未完成
                {
                        if(USART_RX_STA&0x40)//接收到了0x0d
                        {
                                if(res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
                                else USART_RX_STA|=0x80;        //接收完成了
                        }else //还没收到0X0D
                        {       
                                if(res==0x0d)USART_RX_STA|=0x40;
                                else
                                {
                                        USART_RX_BUF[USART_RX_STA&0X3F]=res;
                                        USART_RX_STA++;
                                        if(USART_RX_STA>63)USART_RX_STA=0;//接收数据错误,重新开始接收          
                                }                 
                        }
                }                                                                                                
        }                                                                                           
}

while(1)
        {
                if(USART_RX_STA&0x80)
                {                                          
                        len=USART_RX_STA&0x3f;//得到此次接收到的数据长度
                        printf("\n您发送的消息为:\n");
                        for(t=0;t<len;t++)
                        {
                                USART1->DR=USART_RX_BUF[t];
                                while((USART1->SR&0X40)==0);//等待发送结束
                        }
                        printf("\n\n");//插入换行
                        USART_RX_STA=0;

  USART1->DR=USART_RX_BUF[t];
这里是关键 USART1->DR是双寄存器

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top