OpenEdv-开源电子网

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

用STM32连接GSM模块,是用usart1的,用电脑调试助手发送AT指令是可以实现手机接收到短信的,但是用单片机的话就不行,串口发....

[复制链接]

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
发表于 2016-1-20 23:15:24 | 显示全部楼层 |阅读模式
1金钱
这是主函数的代码           
USART_SendStr("AT+CSCS=\"GSM\"\r\n");
    USART_SendStr("AT+CMGF=1\r\n");//
          USART_SendStr("AT+CMGS=\"18060632154\"");  
                USART_SendStr("hello");//
          //USART_SendStr("AT+CSCS=\"UCS2\"\r\n");
          USART_SendStr("OX1A"); delay_ms(1000);

这是发送的代码   
void USART_SendStr(uint8_t *str)
{
    while(*str)
    {
        while((USART_GetFlagStatus(USART1,USART_FLAG_TC))!=SET);
        USART_SendData(USART1,*str);
        str++;
    }  
#include "usart.h"
#include "delay.h"
#include "string.h"

//////////////////////////////////////////////////////////////////
以下是usart的代码,有谁可以帮我检查下吗  
#if 1
#pragma import(__use_no_semihosting)            

struct __FILE
{
        int handle;
        /* Whatever you require here. If the only file you are using is */
        /* standard output using printf() for debugging, no file handling */
        /* is required. */
};
/* FILE is typedef¡ˉ d in stdio.h. */
FILE __stdout;        
_sys_exit(int x)
{
        x = x;
}

int fputc(int ch, FILE *f)
{  
//     while((USART1->SR&0X40)==0);//Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï   
//     USART1->DR = (u8) ch;   

    if(ch == '\n'){
        while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
        USART_SendData(USART1, '\r');  
    }

    while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == 0);
    USART_SendData(USART1, ch);   
//     
        return ch;
}
#endif
//end
//////////////////////////////////////////////////////////////////

#define USART_RX_BUF_SIZE_MAX    100
#define USART_RX_TIMEOUT_MSESC   2

static volatile u8 UsartRxBuf[USART_RX_BUF_SIZE_MAX];
static volatile u16 UsartRxCnt;
static volatile u32 UsartTimeStamp;
static volatile u8 UsartRxFlag;//ò»μ©USART3½óêüμ½êy¾Y,′˱êÖ¾ÖÃ1

void Uart1Sends(u8 *strl)
{
        while(*strl!='\0')
        {
                USART1->DR=*strl;
                while(USART_FLAG_TC==SET);
                USART_ClearFlag(USART1, USART_FLAG_TC);
                strl++;
        }
}

void USART_SendStr(uint8_t *str)
{
    while(*str)
    {
        while((USART_GetFlagStatus(USART1,USART_FLAG_TC))!=SET);
        USART_SendData(USART1,*str);
        str++;
    }        
}



void Uart1Send(u8 c)
{
        USART1->DR=c;
        while(USART_FLAG_TC==SET);//????????(TI=1)??
        USART_ClearFlag(USART1, USART_FLAG_TC);       
}
void SerUsart_Init(u32 BaudRate)
{       
          GPIO_InitTypeDef GPIO_InitStructure;
          USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    UsartRxCnt = 0;
    UsartRxFlag = RESET;
       
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_10 ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING ;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);   

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);
          USART_InitStructure.USART_BaudRate = BaudRate;//
          USART_InitStructure.USART_WordLength = USART_WordLength_8b;
          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);
          USART_Cmd(USART1, ENABLE);
    USART_ITConfig(USART1, USART_IT_TC, DISABLE);
    USART_ITConfig(USART1, USART_IT_TXE, DISABLE);   
    USART_ClearFlag(USART1, USART_FLAG_TC);

    USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);

        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
        NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init(&NVIC_InitStructure);     
}


FlagStatus SerUsart_GetRxFlag()//½óêÕ
{
    u32 cur_time;

    cur_time = GetCurTime();
    if(((UsartRxCnt > 0) && (cur_time - UsartTimeStamp) >= USART_RX_TIMEOUT_MSESC))
        return SET;
    else
        return RESET;  
}


u16 SerUsart_ReadStr(u8 *p_data, u16 max_len)//
{
    u16 len;

    max_len = max_len - 1;
    len = max_len < UsartRxCnt?max_len:UsartRxCnt;

    memcpy(p_data, (void *)&UsartRxBuf[0], len);
    p_data[len] = '\0';

    UsartRxCnt = 0;

    return len;
}

void USART1_IRQHandler(void)     //
{
    u8 rx_byte;

    if(USART_GetFlagStatus(USART1,USART_FLAG_RXNE)){//&#189;óê&#213;óDêy&#190;Yê±£&#172;USART_FLAG_RXNE&#206;a1
      //   printf("recieve\r\n");

        if( UsartRxCnt < USART_RX_BUF_SIZE_MAX){
            rx_byte = USART_ReceiveData(USART1);

            UsartRxBuf[UsartRxCnt++] = rx_byte;

        }
        UsartTimeStamp = GetCurTime();
        USART_ClearITPendingBit(USART1, USART_IT_RXNE);
    }  
}


      

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

使用道具 举报

14

主题

1593

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2615
金钱
2615
注册时间
2014-7-17
在线时间
348 小时
发表于 2016-1-21 18:03:50 | 显示全部楼层
你发送AT指令间隔最好延时一下!!!
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
 楼主| 发表于 2016-1-25 22:56:44 | 显示全部楼层
FantaSy_ 发表于 2016-1-21 18:03
你发送AT指令间隔最好延时一下!!!

是有间隔的,只是程序调试过程中去掉了,那个加了也不行的。现在的代码换成下面这个还是不行,不知道是不是串口原因       
           delay_ms(3000);//&#209;óê±3&#195;&#235;               
                printf("AT+CSCS=\"GSM\"\r\n");
                delay_ms(3000);//&#209;óê±3&#195;&#235;
                printf("AT+CMGF=1\r\n");
                delay_ms(3000);//&#209;óê±3&#195;&#235;
                printf("AT+CMGS=\"18060614154\"\r\n");//′&#203;′|DT&#184;&#196;&#206;a&#182;&#212;·&#189;μ&#196;μ&#231;&#187;°o&#197;
                delay_ms(5000);//&#209;óê±3&#195;&#235;
                printf("THIS IS GSM SIM900A TEST!\r\n");//DT&#184;&#196;&#182;ìD&#197;&#196;úèY
                delay_ms(3000);//&#209;óê±3&#195;&#235;               
                USART_SendData(USART1,0x1a);
                delay_ms(3000);//&#209;óê±20&#195;&#235;
       
回复

使用道具 举报

1

主题

10

帖子

0

精华

初级会员

Rank: 2

积分
85
金钱
85
注册时间
2016-1-11
在线时间
16 小时
发表于 2016-1-26 10:19:40 | 显示全部楼层
是不是串口线接反了
回复

使用道具 举报

4

主题

16

帖子

0

精华

新手上路

积分
33
金钱
33
注册时间
2016-1-20
在线时间
3 小时
 楼主| 发表于 2016-1-26 13:42:15 | 显示全部楼层
繁忙的耗子 发表于 2016-1-26 10:19
是不是串口线接反了

不是呢,刚刚有用串口调试助手试过了,是可以发短信的,如果是串口线接反了就不行的,所以应该不是这个问题
回复

使用道具 举报

0

主题

4

帖子

0

精华

初级会员

Rank: 2

积分
90
金钱
90
注册时间
2019-11-19
在线时间
27 小时
发表于 2020-1-16 15:06:59 | 显示全部楼层
您好,我对你用stm32给GSM模块发送指令的问题解决很感兴趣,我是大二的学生寒假再做小玩意儿,请问您这个是怎么解决的?
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-6-10 21:23

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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