串口2通信不成功,求指教,谢谢各位

2019-07-20 14:59发布

基本把论坛里有关串口的帖子都看了一遍,也修改了自己的代码,可是使用串口调试助手时,无法打印数据 也无法接受数据,下面是我的代码,求大神看看呀指教一下,我用的是STM32F407.  有点着急呀

usart2.h函数

#ifndef __USART2_H
#define __USART2_H

#include "stdio.h"
#include "stdarg.h"                 
#include "string.h"
#include "main.h"

#define USART2_RXBUFF_SIZE      1024               //定义接收缓冲区大小1024字节
#define USART2_TXBUFF_SIZE      1024               //定义接收缓冲区大小1024字节

extern  u8  USART2_RX_BUF[USART2_RXBUFF_SIZE];     //接收缓冲数组
extern  u16 USART2_RX_STA;                                    //接收状态标记       

extern  u8  USART2_TX_BUF[USART2_TXBUFF_SIZE];     //发送缓冲数组

void   Usart2_init(u32 bound);                     //串口2初始化函数
void u2_printf(char* fmt,...) ;                    //串口2printf函数

#endif


usart.c函数

#include "main.h"
#include "usart2.h"       

u8  USART2_RX_BUF[USART2_RXBUFF_SIZE];     //接收缓冲数组
u16 USART2_RX_STA=0;                       //接收状态标记       

/*-------------------------------------------------*/
/*函数名:初始化串口2                              */
/*参  数:bound:波特率                            */
/*返回值:无                                       */
/*-------------------------------------------------*/
void Usart2_init(u32 bound)
{                  
    GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); //使能GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟
       
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); //PA2复用为USART2
        GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); //PA3复用为USART2

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
        GPIO_Init(GPIOD,&GPIO_InitStructure);               //按配置设置
       
        USART_InitStructure.USART_BaudRate = bound;                                    //波特率设置
        USART_InitStructure.USART_WordLength = USART_WordLength_8b;                    //字长为8位数据格式
        USART_InitStructure.USART_StopBits = USART_StopBits_1;                         //一个停止位
        USART_InitStructure.USART_Parity = USART_Parity_No;                            //无奇偶校验位
        USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
        USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;                       //收发模式
    USART_Init(USART2, &USART_InitStructure);                                      //按配置设置串口2
       
    USART_Cmd(USART2, ENABLE);                              //使能串口 2
        USART_ClearFlag(USART2, USART_FLAG_TC);                        //清除标志位
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);          //开启接受中断

    NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;       //串口2中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3; //抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //中断通道使能
        NVIC_Init(&NVIC_InitStructure);                                //根据配置设置


}

__align(8) u8  USART2_TX_BUF[USART2_TXBUFF_SIZE];          //串口2发送区

/*-------------------------------------------------*/
/*函数名:串口2printf                              */
/*参  数:无                                       */
/*返回值:无   
*/
/*-------------------------------------------------*/
void u2_printf(char* fmt,...)  
{  
        u16 i,length;
       
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART2_TX_BUF,fmt,ap);
        va_end(ap);
       
        length=strlen((const char*)USART2_TX_BUF);       
        while((USART2->SR&0X40)==0);
        for(i = 0;i < length;i ++)
        {                       
                USART2->DR = USART2_TX_BUF[i];
                while((USART2->SR&0X40)==0);       
        }       
}


主函数如下

#include "main.h"
#include "delay.h"
#include "usart2.h"

int main(void)
{   
        u16 len;
    u8  time;
       
        delay_init();          //延时初始化
        Usart2_init(9600);   //串口1初始化波特率为115200
        while(1)
        {                 
                if(time>=50)                                        //time>=50表示500ms时间到
                {
                        time=0;                                         //清除计数位
                        u2_printf("请您发送数据,以回车结尾 ");      //500ms时间到,发送提示信息
                }
                if(USART2_RX_STA&0x8000)                            //USART1_RX_STA位15置位,表示接收完成
                {                                          
                        len=USART2_RX_STA&0x3fff;                          //得到此次接收到的数据长度
                        USART2_RX_BUF[len]=''   ;                        //加入结束符
                        u2_printf("你发送的数据:%s ",USART2_RX_BUF);   //返回接收到的数据
                        USART2_RX_STA=0;                                   //清除状态位
                }
                time++;                                                //计数+1
                delay_ms(10);                                          //延时10ms
        }
}





友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。