gpt4 book ai didi

c - STM32 C 中的全局变量

转载 作者:太空宇宙 更新时间:2023-11-04 02:35:08 28 4
gpt4 key购买 nike

我正在开发一个项目,我需要在主函数中使用“extern”来使用在某个文件(例如 mylib.c)中声明的一个变量。所有 header 都包含保护字以避免多次包含。变量是一个结构体(在mylib.h中定义),其成员只有 float 和整数。它在main函数开始时被初始化。

在进入主循环并做了一些工作后,一些不关心的成员获得了随机值。

因此,我从 main 中的声明中删除了 extern,而是将其放在 mylib.c 中的声明中。它奏效了。

Sim808.h

#ifndef _SIM808_H
#define _SIM808_H
typedef struct{
uint8_t GPRS_Active;

float gsm_latitude;
float gsm_longitude;
}SIM808;
void sendCmd(const char cmd[]);
void sim808_init(void);
void parse_gsm_location(uint8_t* line);
#endif

Sim808.c

#include "sim808.h"
SIM808 sim808;
void parse_gsm_location(uint8_t* line)
{
uint8_t commas=0,index=0;
uint16_t err;
if((err=atoi((const char*)line+12))!=0)
{
printf("No coordinates received\n");
if(err==404 || err==601)
sim808.GPRS_Active=0;

return;
}
while (line[index]!= '\0' && index <50)
{
if(line[index]==',')
{
commas++;
switch (commas)
{
case 1:
sim808.gsm_longitude=atof((const char*)(line+index+1));
printf("Long:%f\n",sim808.gsm_longitude);
break;
case 2:
sim808.gsm_latitude=atof((const char*)(line +index+1));
printf("Longitude%f Latitude%f\n",sim808.gsm_longitude,sim808.gsm_latitude);
break;
case 3:
sscanf((const char*)(line+index+1),"%4d/%2d/%2d", (int*)&sim808.gsmDate.year,(int*)&sim808.gsmDate.month,
(int*)&sim808.gsmDate.day);
break;
case 4:
sscanf((const char*)(line+index+1),"%2d/%2d/%2d",
(int*)&sim808.gsmTime.hours,(int*)&sim808.gsmTime.minutes,(int*)&sim808.gsmTime.seconds);
break;
}
}
index++;
}
}

主.c

#include "sim808.h"
extern SIM808 sim808;

int main(void)
{
uint8_t response[150];
//init functions
while(1)
{
if(sim808.GPRS_Active==1)
{
sendCmd("AT+CIPGSMLOC=1,1\r\n");
HAL_UART_Receive(&huart4,response,2,60000);//max response time is 1 min
HAL_UART_Receive(&huart4,response,150,1000);//we dont need first 2 chars
parse_gsm_location(response);
memset((void*)response,0,150);
}
else
sim808_init();
}
}

如您所见,我的代码中GPRS_Active成员只能接收1或0。使用printf,第一次迭代后变成了242。有人可以解释吗?这可能是编译器错误吗?谢谢。

最佳答案

编译器问题的可能性很小。更有可能的是您的变量被代码的某些部分修改了。尽量避免使用全局变量,因为它们的范围最大。

你是否在某处使用了同名局部变量?
您是否检查过映射文件或在调试器中放置它的位置?

如果特定地址的数据发生变化,您可以使用调试器功能数据观察来中断,以帮助您跟踪此问题。

关于c - STM32 C 中的全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38697676/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com