我正在处理一个项目,在该项目中,我需要在主函数中使用'external'在某个文件(比如mylib.c)中声明的一个变量。所有标题都包含保护字,以避免多次包含。变量是一个结构(在mylib.h中定义),其成员仅为浮点和整数。它在主函数的开头初始化。
在进入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 receivedn");
if(err==404 || err==601)
sim808.GPRS_Active=0;
return;
}
while (line[index]!= ' ' && index <50)
{
if(line[index]==',')
{
commas++;
switch (commas)
{
case 1:
sim808.gsm_longitude=atof((const char*)(line+index+1));
printf("Long:%fn",sim808.gsm_longitude);
break;
case 2:
sim808.gsm_latitude=atof((const char*)(line +index+1));
printf("Longitude%f Latitude%fn",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++;
}
}
main.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,1rn");
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。有人能解释一下吗?这可能是编译器错误吗?谢谢
这是编译器问题的可能性非常小。更有可能的是,您的变量被代码的某些部分修改了。尽量避免使用全局变量,因为它们的作用域最大。
你们在某处使用同名的局部变量吗
您是否检查了映射文件或在调试器中它的放置位置?
如果某个地址的数据发生更改,您可以使用调试器功能datawatch来帮助跟踪此问题。
当我使用全局变量时,我不会在.h文件中声明它们,以避免多个包含的问题。当然,你可以找到一些技巧来在.h中声明它们,但我认为这会让事情变得如此复杂。所以试试这个:
在mylib.c中:
int myGlobalVariable;
主要.c
extern int myGlobalVariable;
int main(void)
{
myGlobalVariable = 5;
}
如果您仍然有问题,请尝试增加堆栈的大小。如果堆栈不够大,它可能会被其他数据覆盖。
如果在任何代码中使用memset或memcpy,请确保length参数是正确的。memset和memcpy是非常危险的,您可以很容易地在内存的某个部分写入您并不真正想要的内容。