OpenEdv-开源电子网

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

串口2改为串口3后,手机卡就不能识别了,求大牛帮忙指出错误。

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-11-8
在线时间
1 小时
发表于 2018-11-8 21:23:52 | 显示全部楼层 |阅读模式
1金钱
串口.C
#include "delay.h"
#include "usart2.h"
#include "stdarg.h"                  
#include "stdio.h"                  
#include "string.h"         

u16 point2 = 0;

//???????   
__align(8) u8 USART3_TX_BUF[USART3_MAX_SEND_LEN];   //????,??USART2_MAX_SEND_LEN??
#ifdef USART3_RX_EN                                 //???????         
//???????   
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN];              //????,??USART2_MAX_RECV_LEN???.



//????????2????????????10ms?????????????.
//??2?????????10ms,?????1?????.?????10ms?????
//????,?????????.
//????????
//[15]:0,???????;1,????????.
//[14:0]:????????
u16 USART3_RX_STA=0;     
void USART3_IRQHandler(void)
{
    u8 res;     
    if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//?????
    {   

    res =USART_ReceiveData(USART3);     
        if(USART3_RX_STA<USART3_MAX_RECV_LEN)        //???????
        {
            TIM_SetCounter(TIM2,0);//?????                       
            if(USART3_RX_STA==0)TIM2_Set(1);        //?????4???
            USART3_RX_BUF[USART3_RX_STA++]=res;     //???????   
        }else
        {
            USART3_RX_STA|=1<<15;                 //????????
        }
    }                                            
}   
void USART3_CLR_Buf(void)                           // ′&#174;&#191;ú&#187;o′&#230;&#199;&#229;àí
{
        memset(USART3_RX_BUF, 0, USART3_MAX_RECV_LEN);      //&#199;&#229;&#191;&#213;
  point2 = 0;                    
}
//???IO ??3
//pclk1CLK1????(Mhz)
//bound:???   
void USART3_Init(u32 bound)
{  

    NVIC_InitTypeDef NVIC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);   // GPIOB??
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE);

    USART_DeInit(USART3);  //????3
         //USART3_TX   PB.10
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PA.2
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //??????
  GPIO_Init(GPIOB, &GPIO_InitStructure); //???PA2

    //USART3_RX   PB.11
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
//  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//????
  GPIO_Init(GPIOB, &GPIO_InitStructure);  //???PA3

    USART_InitStructure.USART_BaudRate = bound;//?????9600;
    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(USART3, &USART_InitStructure); //?????   2

    //?????
// USART2->BRR=(pclk1*1000000)/(bound);// ?????  
    //USART2->CR1|=0X200C;   //1???,????.
    USART_DMACmd(USART3,USART_DMAReq_Tx,ENABLE);    //????2?DMA??
    UART_DMA_Config(DMA1_Channel2,(u32)&USART3->DR,(u32)USART3_TX_BUF);//DMA2??3,?????3,????USART3_TX_BUF
    USART_Cmd(USART3, ENABLE);                    //????

#ifdef USART3_RX_EN         //???????
    //??????
  USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//????   

    NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//?????3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //????3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ????
    NVIC_Init(&NVIC_InitStructure); //??????????VIC???
    TIM2_Init(49,7199);     //10ms??
    USART3_RX_STA=0;        //??
    TIM2_Set(0);            //?????4
#endif      

}
//??3,printf ??
//???????????USART2_MAX_SEND_LEN??
void printf3(char* fmt,...)  
{  
    va_list ap;
    va_start(ap,fmt);                        
    vsprintf((char*)USART3_TX_BUF,fmt,ap);
    va_end(ap);
    while(DMA_GetCurrDataCounter(DMA1_Channel2)!=0);    //????7????   
    UART_DMA_Enable(DMA1_Channel2,strlen((const char*)USART3_TX_BUF));  //??dma????
}
//???4??????            
void TIM2_IRQHandler(void)
{   
    if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)//?????
    {                  
        USART3_RX_STA|=1<<15; //??????
        TIM_ClearITPendingBit(TIM2, TIM_IT_Update  );  //??TIMx??????   
        TIM2_Set(0);            //??TIM4  
    }      
}
//??TIM4???
//sta:0,??;1,??;
void TIM2_Set(u8 sta)
{
    if(sta)
    {

        TIM_SetCounter(TIM2,0);//?????
        TIM_Cmd(TIM2, ENABLE);  //??TIMx   
    }else TIM_Cmd(TIM2, DISABLE);//?????4      
}
//??????????
//???????APB1?2?,?APB1?36M
//arr:??????
//psc:??????         
void TIM2_Init(u16 arr,u16 psc)
{   
    NVIC_InitTypeDef NVIC_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); //????//TIM4????   

    //???TIM3???
    TIM_TimeBaseStructure.TIM_Period = arr; //???????????????????????????   
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //??????TIMx???????????
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //??????:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM??????
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); //??????????TIMx???????

    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE ); //?????TIM4??,??????


    NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1 ;//?????3
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;      //????3
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;         //IRQ????
    NVIC_Init(&NVIC_InitStructure); //??????????VIC???

}
#endif                        
///////////////////////////////////////USART2 DMA·¢&#203;í&#197;&#228;&#214;&#195;2&#191;·&#214;//////////////////////////////////                               
//DMA1μ&#196;&#184;÷í¨μà&#197;&#228;&#214;&#195;
//&#213;aà&#239;μ&#196;′&#171;ê&#228;D&#206;ê&#189;ê&#199;1ì&#182;¨μ&#196;,&#213;aμ&#227;òa&#184;ù&#190;Y2&#187;í&#172;μ&#196;&#199;é&#191;&#246;à′DT&#184;&#196;
//′ó′&#230;′¢&#198;÷->íaéè&#196;£ê&#189;/8&#206;&#187;êy&#190;Y&#191;í&#182;è/′&#230;′¢&#198;÷&#212;&#246;á&#191;&#196;£ê&#189;
//DMA_CHxMAí¨μàCHx
//cpar:íaéèμ&#216;&#214;·
//cmar:′&#230;′¢&#198;÷μ&#216;&#214;·   
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar)
{
        DMA_InitTypeDef DMA_InitStructure;
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);        //ê1&#196;üDMA′&#171;ê&#228;
  DMA_DeInit(DMA_CHx);   //&#189;&#171;DMAμ&#196;í¨μà1&#188;&#196;′&#230;&#198;÷&#214;&#216;éè&#206;aè±ê&#161;&#214;μ
        DMA_InitStructure.DMA_PeripheralBaseAddr = cpar;  //DMAíaéèADC&#187;ùμ&#216;&#214;·
        DMA_InitStructure.DMA_MemoryBaseAddr = cmar;  //DMA&#196;ú′&#230;&#187;ùμ&#216;&#214;·
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralDST;  //êy&#190;Y′&#171;ê&#228;·&#189;&#207;ò£&#172;′ó&#196;ú′&#230;&#182;áè&#161;·¢&#203;íμ&#189;íaéè
        DMA_InitStructure.DMA_BufferSize = 0;  //DMAí¨μàμ&#196;DMA&#187;o′&#230;μ&#196;′óD&#161;
        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;  //íaéèμ&#216;&#214;·&#188;&#196;′&#230;&#198;÷2&#187;±&#228;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;  //&#196;ú′&#230;μ&#216;&#214;·&#188;&#196;′&#230;&#198;÷μY&#212;&#246;
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;  //êy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte; //êy&#190;Y&#191;í&#182;è&#206;a8&#206;&#187;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;  //1¤×÷&#212;ú&#213;y3£&#187;o′&#230;&#196;£ê&#189;
        DMA_InitStructure.DMA_Priority = DMA_Priority_Medium; //DMAí¨μà xóμóD&#214;Dó&#197;&#207;è&#188;&#182;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;  //DMAí¨μàx&#195;&#187;óDéè&#214;&#195;&#206;a&#196;ú′&#230;μ&#189;&#196;ú′&#230;′&#171;ê&#228;
        DMA_Init(DMA_CHx, &DMA_InitStructure);  //&#184;ù&#190;YDMA_InitStruct&#214;D&#214;&#184;&#182;¨μ&#196;2&#206;êy3&#245;ê&#188;&#187;ˉDMAμ&#196;í¨μàUSART1_Tx_DMA_Channel&#203;ù±êê&#182;μ&#196;&#188;&#196;′&#230;&#198;÷       
}
//&#191;a&#198;&#244;ò&#187;′&#206;DMA′&#171;ê&#228;
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len)
{
        DMA_Cmd(DMA_CHx, DISABLE );  //1&#216;±&#213; &#214;&#184;ê&#190;μ&#196;í¨μà        
        DMA_SetCurrDataCounter(DMA_CHx,len);//DMAí¨μàμ&#196;DMA&#187;o′&#230;μ&#196;′óD&#161;       
        DMA_Cmd(DMA_CHx, ENABLE);           //&#191;a&#198;&#244;DMA′&#171;ê&#228;
}          
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////                                                                          


串口.H
#ifndef __USART3_H
#define __USART3_H         
#include "sys.h"  


#define USART3_MAX_RECV_LEN                200                                        //×&#238;′ó&#189;óê&#213;&#187;o′&#230;×&#214;&#189;úêy
#define USART3_MAX_SEND_LEN                200                                        //×&#238;′ó·¢&#203;í&#187;o′&#230;×&#214;&#189;úêy
#define USART3_RX_EN                         1                                        //0,2&#187;&#189;óê&#213;;1,&#189;óê&#213;.

extern u8  USART3_RX_BUF[USART3_MAX_RECV_LEN];                 //&#189;óê&#213;&#187;o3&#229;,×&#238;′óUSART2_MAX_RECV_LEN×&#214;&#189;ú
extern u8   USART3_TX_BUF[USART3_MAX_SEND_LEN];                 //·¢&#203;í&#187;o3&#229;,×&#238;′óUSART2_MAX_SEND_LEN×&#214;&#189;ú
extern u16 USART3_RX_STA;                                                   //&#189;óê&#213;êy&#190;Y×′ì&#172;

void USART3_Init(u32 bound);                                //′&#174;&#191;ú23&#245;ê&#188;&#187;ˉ
void TIM2_Set(u8 sta);
void TIM2_Init(u16 arr,u16 psc);
void UART_DMA_Config(DMA_Channel_TypeDef*DMA_CHx,u32 cpar,u32 cmar);
void UART_DMA_Enable(DMA_Channel_TypeDef*DMA_CHx,u8 len);
void printf3(char* fmt,...);

// u8 USART2_Hand(char *a) ;
void USART3_CLR_Buf(void);

extern u16 point2;

#endif


主程序

#define Success 1U
#define Failure 0U

//&#182;¨ò&#229;±&#228;á&#191;
unsigned long  Time_Cont = 0;       //&#182;¨ê±&#198;÷&#188;&#198;êy&#198;÷

char phoneNumber[] = "18377457356";                //ì&#230;&#187;&#187;3éDèòa±&#187;2|′òμ&#231;&#187;°μ&#196;o&#197;&#194;&#235;
char msg[] = "yourenkaojin";                //&#182;ìD&#197;&#196;úèY       


void errorLog(int num);
void phone(char *number);
unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry);
void Sys_Soft_Reset(void);
void sendMessage(char *number,char *msg);

int main(void)
{       
        delay_init();
       
        NVIC_Configuration();          //éè&#214;&#195;NVIC&#214;D&#182;&#207;·&#214;×é2:2&#206;&#187;&#199;à&#213;&#188;ó&#197;&#207;è&#188;&#182;£&#172;2&#206;&#187;&#207;ìó|ó&#197;&#207;è&#188;&#182;
        uart_init(9600);         //′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
        USART3_Init(9600);        //′&#174;&#191;ú22¨ì&#216;&#194;ê9600
        printf3("AT\r\n");
        Init_LEDpin();

       
        printf("Welcome to use!\r\n");
        printf("ILoveMcu.taobao.com!\r\n");
       
        if (sendCommand("AT\r\n", "OK\r\n", 3000, 10) == Success);
        else errorLog(1);
        delay_ms(10);

        if (sendCommand("AT+CPIN?\r\n", "READY", 3000, 10) == Success);
        else errorLog(3);
        delay_ms(10);

        if (sendCommand("AT+CREG?\r\n", ",1", 3000, 10) == Success);        //±&#190;μ&#216;SIM&#191;¨
        else if(sendCommand("AT+CREG?\r\n", ",5", 3000, 10) == Success        );//&#194;tó&#206;SIM&#191;¨
        else        errorLog(3);
        delay_ms(10);


        if (sendCommand("AT+CMGF=1\r\n", "OK\r\n", 1000, 10) == Success);
        else errorLog(3);
        delay_ms(10);

        if (sendCommand("AT+CSCS=\"GSM\"\r\n", "OK\r\n", 1000, 10) == Success);
        else errorLog(5);
        delay_ms(10);


        sendMessage(phoneNumber,msg);                //·¢&#203;í&#182;ìD&#197;
       
        while(1)
        {
               
        }
}

void sendMessage(char *number,char *msg)
{
        char send_buf[20] = {0};
        memset(send_buf, 0, 20);    //&#199;&#229;&#191;&#213;
        strcpy(send_buf, "AT+CMGS=\"");
        strcat(send_buf, number);
        strcat(send_buf, "\"\r\n");
        if (sendCommand(send_buf, ">", 3000, 10) == Success);
        else errorLog(6);

        if (sendCommand(msg, msg, 3000, 10) == Success);
        else errorLog(7);

        memset(send_buf, 0,20);    //&#199;&#229;&#191;&#213;
        send_buf[0] = 0x1a;
        send_buf[1] = '\0';
        if (sendCommand(send_buf, "OK\r\n", 10000, 5) == Success);
        else errorLog(8);
}

void errorLog(int num)
{
        printf("ERROR%d\r\n",num);
        while (1)
        {
                if (sendCommand("AT\r\n", "OK\r\n", 100, 10) == Success)
                {
                        Sys_Soft_Reset();
                }
                delay_ms(200);
        }
}

void Sys_Soft_Reset(void)
{  
    SCB->AIRCR =0X05FA0000|(u32)0x04;      
}

void phone(char *number)
{
        char send_buf[20] = {0};
        memset(send_buf, 0, 20);    //&#199;&#229;&#191;&#213;
        strcpy(send_buf, "ATD");
        strcat(send_buf, number);
        strcat(send_buf, ";\r\n");

        if (sendCommand(send_buf, "OK\r\n", 10000, 10) == Success);
        else errorLog(4);
}

unsigned int sendCommand(char *Command, char *Response, unsigned long Timeout, unsigned char Retry)
{
        unsigned char n;
        USART3_CLR_Buf();
        for (n = 0; n < Retry; n++)
        {
printf3(Command);                 //·¢&#203;íGPRS&#214;&#184;á&#238;
               
                printf("\r\n***************send****************\r\n");
                printf(Command);
               
                Time_Cont = 0;
                while (Time_Cont < Timeout)
                {
                        delay_ms(100);
                        Time_Cont += 100;
                        if (strstr(USART3_RX_BUF, Response) != NULL)
                        {                               
                                printf("\r\n***************receive****************\r\n");
                                printf(USART3_RX_BUF);
                                USART3_CLR_Buf();
                                return Success;
                        }
                       
                }
                Time_Cont = 0;
        }
        printf("\r\n***************receive****************\r\n");
        printf(USART3_RX_BUF);
        USART3_CLR_Buf();
        return Failure;
}







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

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-11-9 01:56:35 | 显示全部楼层
把串口3调成可以正常工作先,直接和串口助手通信
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
10
金钱
10
注册时间
2018-11-8
在线时间
1 小时
 楼主| 发表于 2018-11-9 10:29:00 | 显示全部楼层
正点原子 发表于 2018-11-9 01:56
把串口3调成可以正常工作先,直接和串口助手通信

已经可以通信,但是打印只能运行到AT+CPIN?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-21 21:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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