关于串口2可以串口1却无法实现功能的问题

2019-07-20 02:05发布

我现在在用单片机和4G模块进行一个通信,我用串口2可以实现和4G模块指令的收发和数据的回传,换成串口1就不行了。贴上主函数和两个串口的代码。
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "string.h"
#include "usart2.h"       


int main(void)
{
       
        u16 i = 0;
        u16 len = 0;
        u8 flag = 0;
        u16 times = 0;
        u8 t;

  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
        KEY_Init();       //初始化与按键连接的硬件接口
LED_Init();
        delay_init(168);                  //初始化延时函数
//        usart2_init(115200);        //初始化串口波特率为115200
        uart_init(115200);

       
LED2=0;
        while(1)
        {
               

                t=KEY_Scan(0);
                if(t==KEY1_PRES)  //KEY1按下
                {
                                USART1_Send_String("+++");
                       
                        delay_ms(500);
//                                u2_printf("%s",USART2_RX_BUF);
       
                        if(strstr(USART_RX_BUF,"a")!=NULL)
                        {
                                USART_RX_STA=0;
//                                LED2=1;
                                USART1_Send_String("a");
                                delay_ms(500);
                                                if(strstr(USART_RX_BUF,"+ok")!=NULL)         //ok
                        {
                                        USART_RX_STA=0;
                                        USART1_Send_String("AT+CCLK ");
                                LED2=0;
                                delay_ms(500);       
                                if(strstr(USART_RX_BUF,"CCLK")!=NULL)        {
                                LED2=!LED2;
                                        len=USART_RX_STA&0x3fff;//得到此次接收到的数据长度
                                        for(i=0;i<len;i++)
                                         {
                                                 if(USART_RX_BUF[i])
                                         buf[i] = USART_RX_BUF[i];
                                         
                                         }
//                                        printf(USART2_RX_BUF);
                                         USART_RX_STA=0;
                                        USART1_Send_String("AT+ENTM ");
                                         delay_ms(2000);
                                         printf("%s",buf);
                                }
                        }

                                }
                        }
                }
       

                delay_ms(10);

        }
            
//串口2
#include "sys.h"
#include "usart2.h"       
#include "delay.h"
#include "stdarg.h"                  
#include "stdio.h"                  
#include "string.h"         
//////////////////////////////////////////////////////////////////////////////////          
//如果使用ucos,则包括下面的头文件即可.


u8  USART2_RX_BUF[USART2_MAX_RECV_LEN];                                 //接收缓冲,最大USART2_MAX_RECV_LEN个字节.
u8  USART2_TX_BUF[USART2_MAX_SEND_LEN];                         //发送缓冲,最大USART2_MAX_SEND_LEN字节

vu16 USART2_RX_STA=0;

void usart2_init(u32 bound){
   //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);//使能USART2时钟

        //串口1对应引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_USART2); //GPIOA2复用为USART2
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_USART2); //GPIOA3复用为USART2
       
        //USART1端口配置
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3; //GPIOA2与GPIOA3
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA2,PA3

   //USART1 初始化设置
        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); //初始化串口1
       
  USART_Cmd(USART2, ENABLE);  //使能串口1
       
        //USART_ClearFlag(USART1, USART_FLAG_TC);
               
        USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启相关中断

        //Usart1 NVIC 配置
        NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口1中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//抢占优先级2
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =1;                //子优先级1
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、       
}


void u2_printf(char* fmt,...)  
{  
        u16 i,j;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART2_TX_BUF,fmt,ap);
        va_end(ap);
        i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
        for(j=0;j<i;j++)//循环发送数据
        {
          while(USART_GetFlagStatus(USART2,USART_FLAG_TC)==RESET);  //等待上次传输完成
                USART_SendData(USART2,(uint8_t)USART2_TX_BUF[j]);          //发送数据到串口2
        }
       
}
void USART2_IRQHandler(void)  
{ u8 res2;      
if(USART2->SR&(1<<5))//接收到数据  
    {   
             res2=USART2->DR;  
             USART2_RX_BUF[USART2_RX_STA]=res2;  
             USART2_RX_STA++;  
                   }  
           }


//串口1

#include "sys.h"
#include "usart.h"       
#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误          
u8 USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15,        接收完成标志
//bit14,        接收到0x0d
//bit13~0,        接收到的有效字节数目
u16 USART_RX_STA=0;       //接收状态标记       
u8 buf[18];
//初始化IO 串口1
//bound:波特率
void uart_init(u32 bound){
   //GPIO端口设置
  GPIO_InitTypeDef GPIO_InitStructure;
        USART_InitTypeDef USART_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE); //使能GPIOA时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);//使能USART1时钟

        //串口1对应引脚复用映射
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource9,GPIO_AF_USART1); //GPIOA9复用为USART1
        GPIO_PinAFConfig(GPIOA,GPIO_PinSource10,GPIO_AF_USART1); //GPIOA10复用为USART1
       
        //USART1端口配置
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_10; //GPIOA9与GPIOA10
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //速度50MHz
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
        GPIO_Init(GPIOA,&GPIO_InitStructure); //初始化PA9,PA10

   //USART1 初始化设置
        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(USART1, &USART_InitStructure); //初始化串口1
       
  USART_Cmd(USART1, ENABLE);  //使能串口1
       
        USART_ClearFlag(USART1, USART_FLAG_TC);
       
#if EN_USART1_RX       
        USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);//开启相关中断

        //Usart1 NVIC 配置
  NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;//串口1中断通道
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3;//抢占优先级3
        NVIC_InitStructure.NVIC_IRQChannelSubPriority =3;                //子优先级3
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                        //IRQ通道使能
        NVIC_Init(&NVIC_InitStructure);        //根据指定的参数初始化VIC寄存器、

#endif
       
}
void USART1_Send_Byte(u8 Data)                                                                 //发送一个字节;
{
        USART_ClearFlag(USART1, USART_FLAG_TC);
        USART_SendData(USART1,Data);
        while( USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET );
}

void USART1_Send_String(u8 *Data)                                                 //发送字符串;
{
        while(*Data)
        USART1_Send_Byte(*Data++);
}
void USART1_IRQHandler(void)  
{ u8 res;      
if(USART1->SR&(1<<5))//接收到数据  
    {   
             res=USART1->DR;  
             USART_RX_BUF[USART_RX_STA]=res;  
             USART_RX_STA++;  
                   }  
           }









友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
awsawzj
1楼-- · 2019-07-20 05:10
你这个串口初始化引脚就有问题,只有TXD才配置成推挽输出
paralzer
2楼-- · 2019-07-20 06:39
 精彩回答 2  元偷偷看……

一周热门 更多>