OpenEdv-开源电子网

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

全局变量异常变化

[复制链接]

190

主题

401

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1289
金钱
1289
注册时间
2014-6-15
在线时间
143 小时
发表于 2016-6-22 21:47:22 | 显示全部楼层 |阅读模式
1金钱

下面是我测试GPRS的程序,
程序中有个结构体变量 g_SIM900.Step和全局变量g_sendStep


我仿真发现 这两个变量的值会变得很奇怪,
现在g_SIM900.Step根本没有使用, 发现它却会改变,怎么回事?
g_sendStep 有使用,但是 他会变成一个不应该有的值,很奇怪。

最开始是g_SIM900.Step    switch(g_SIM900.Step) ,发现 g_SIM900.Step的不正常后改成switch(g_sendStepp) ,后g_sendStep不正常。
但是这个时候g_SIM900.Step 根本没有使用  求大神帮忙




#include "stm32f10x.h"
#include "main.h"
#include "key.h"
#include <string.h>
#include <stdio.h>
#ifdef __GNUC__

  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
#else
  #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
#endif


#define EVAL_COM  USARTx

PUTCHAR_PROTOTYPE
{


  USART_SendData(EVAL_COM, (uint8_t) ch);

  while (USART_GetFlagStatus(EVAL_COM, USART_FLAG_TC) == RESET)
  {}
  return ch;
}
//#ifdef  USE_FULL_ASSERT
void GPIO_Configuration(void);
void USART_Configuration(u32 baud);
void TaskBaseTime(void);
void uart_init(u32 bound);
static unsigned char FineString(unsigned char *szDes, unsigned char *szSrc);

#define LED1_ON GPIO_ResetBits(GPIOB,GPIO_Pin_5)
#define LED1_OFF GPIO_SetBits(GPIOB,GPIO_Pin_5)

#define POWER_OFF GPIO_ResetBits(GPIOB,GPIO_Pin_4)
#define POWER_ON GPIO_SetBits(GPIOB,GPIO_Pin_4)
SIM900Str g_SIM900;
USARTStr g_USART;


u8 g_sendStep=0;
u8 g_SendCmdIndex=0;
vu16 g_LedFlashTime =1000;
char  SIM900CMD [][50]={{"AT\r\n"},   //返回OK只能代表模块正常,不代表SIM卡正常,
                 {"ATE0\r\n"},
                 {"AT+CREG?\r\n"},
                 {"ATZ\r\n"},
                 {"AT+CGCLASS=\"B\"\r\n"},
                 {"AT+CGDCONT=1,\"IP\",\"CMNET\"\r\n"},
                 {"AT+CGATT=1\r\n"},
                 {"AT+CIPCSGP=1,\"CMNET\"\r\n"},
                 {"AT+CIPSTART=\"TCP\",\"61.174.40.245\",\"27980\"\r\n"},

                 };


int main(void)
{

  SystemInit();
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
    /* Configure the Priority Group to 2 bits */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
  GPIO_Configuration();
  USART_Configuration(9600);
  TaskBaseTime();
  KeyIO_Init();
  g_sendStep =0;
  g_LedFlashTime =1000;

  g_sendStep = 1;
  while (1)
  {
    /*
    if( IOFir_stru.ScanTime==0 )
    {
       IOFir_stru.ScanTime = 2;
       IOFir_stru.updata(&IOFir_stru);
       key.InData = IOFir_stru.IOData;
       KeyScan(&key);
    }
   */

   if(g_LedFlashTime>500)
   {
     LED1_ON;  
   }
   else
   {
     LED1_OFF;
   }
  if(!g_LedFlashTime)
   {
    g_LedFlashTime=1000;     
   }

   switch(g_sendStep)
   {
   case 1:
       printf(SIM900CMD[g_SendCmdIndex]);
       g_sendStep =2;
       g_SIM900.TimeOver =1000;
   break;
    case 2:
     if(g_SIM900.TimeOver)
        {

           if( FineString(g_USART.RXbuf,"OK"))
            {
              g_sendStep =1;
              g_SendCmdIndex++;
              memset(g_USART.RXbuf,0,20);
              //if(g_SendCmdIndex >=(sizeof(SIM900CMD)/sizeof(SIM900CMD[0])-1))
                if(g_SendCmdIndex >=8)
                  g_sendStep = 3;
            }
        }else
        {
          g_sendStep = 1;
        }
     break;
    case 3:
       printf(SIM900CMD[8]);
       g_SIM900.TimeOver = 10000;
       g_sendStep =4;
   break;
   case 4:
     if(g_SIM900.TimeOver)
     {
       if( FineString(g_USART.RXbuf,"CONNECT OK"))
        {
          g_sendStep = 5;
        }
     }
     else
     {
       g_sendStep = 3;
     }
   break;

   case 5:
       printf("AT+CIPSEND\r\n");
       g_sendStep = 7;
   break;
   case 7:
       if( FineString(g_USART.RXbuf,">"))
        {
          g_sendStep =8;
          memset(g_USART.RXbuf,0,20);
        }
   break;
   case 8:
       printf("12341232453654769876123456789997654322345678\r\n");
       g_sendStep =9;
   break;
   case 9:
       while(USART_GetFlagStatus(USARTx,USART_FLAG_TC)!=SET);
       USART_SendData(EVAL_COM, 0x1A); //向串口 1 发送数据
       g_sendStep = 10;
   break;
   case 10:
       if( FineString(g_USART.RXbuf,"OK"))
        {
          memset(g_USART.RXbuf,0,20);
          g_sendStep = 5;
        }
   break;
/**/
   default:
   break;
   }
  }
}

/**
  * @brief  Configure the GPIOD Pins.
  * @param  None
  * @retval : None
  */
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  /* GPIOB configuration: PB12 PB13 PB14 PB15 as led controller */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
}

/*******************************************************************************
* 函数名称  : USART_Configuration
* 描述      : 初始化通讯口1,波特率:9600 数据w
* 输入      : None
* 输出      : None
* 返回      : None
*******************************************************************************/
void USART_Configuration(u32 baud)
{
    USART_InitTypeDef USART_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;
    RCC_APB2PeriphClockCmd(USART_TX_CLK | USART_TX_CLK, ENABLE);
    RCC_APBxPeriphClockCmd(USARTx_CLK, ENABLE);
    GPIO_InitStructure.GPIO_Pin = USART_TX_PIN; //TX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//GPIO_Mode_AF_PP;
    GPIO_Init(USART_TX_GPIO, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = USART_RX_PIN;  //RX
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;//GPIO_Mode_AF_PP;
    GPIO_Init(USART_RX_GPIO, &GPIO_InitStructure);
    /* Configure USARTx */
    USART_DeInit(USARTx);
    USART_InitStructure.USART_BaudRate = baud;
    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;
    /* Configure USARTx */
    USART_Init(USARTx, &USART_InitStructure);
    /* Enable USART1 Receive and Transmit interrupts */
    NVIC_InitStructure.NVIC_IRQChannel = USARTx_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);

    USART_ITConfig(USARTx, USART_IT_RXNE, ENABLE);//DISABLE
    USART_ITConfig(USARTx, USART_IT_TXE, DISABLE);
    /* Enable the USARTx */
    USART_Cmd(USARTx, ENABLE);
}

/*******************************************************************************
* Function Name  : TaskBaseTime
* Description    : 用作任务管理或其它定时的时间基准。基准为1ms
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void TaskBaseTime(void)
{
  /* Setup SysTick Timer for 1 msec interrupts  */
  if (SysTick_Config(SystemCoreClock / 1000))//5000
  {
  /* Capture error */
    while (1);
  }
  /* Configure the SysTick handler priority */
  NVIC_SetPriority(SysTick_IRQn, 0x0);  
}



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

使用道具 举报

14

主题

1592

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2622
金钱
2622
注册时间
2014-7-17
在线时间
350 小时
发表于 2016-6-22 22:38:19 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165536
金钱
165536
注册时间
2010-12-1
在线时间
2117 小时
发表于 2016-6-22 22:38:38 | 显示全部楼层
有可能结构体里面的某些变量你越界访问了。
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-10 13:39

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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