OpenEdv-开源电子网

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

结构体中定义的数组,在中断函数中无法正确域值

[复制链接]

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
发表于 2011-8-24 21:53:27 | 显示全部楼层 |阅读模式

 GPRS.h中有如下定义


extern char RecNumber[MAX_PHONE_NUMBER_LENGTH + 1];  //接收到电话号码
extern  char Content[MAX_MESSAGE_CONTENT_LENGTH];     //接收到短信内容


typedef struct S_DateTimeTag
{
 u16 nYear;
 u8 nMonth;
 u8 nDay;
 u8 nHour;
 u8 nMin;
 u8 nSec;
}S_DateTime;

//接收到短信相关信息
typedef struct MessageInfoTag
{

   char szRecNumber[MAX_PHONE_NUMBER_LENGTH + 1];  //接收到电话号码
   char szContent[MAX_MESSAGE_CONTENT_LENGTH];     //接收到短信内容
   //MessageType eType;                              //接收类型         

   S_DateTime sRecTime;                           //接收信息时间       

  //char szSendingData[MAX_MESSAGE_CONTENT_LENGTH];
}MessageInfo;


在GPRS.c  中定义如下

char RecNumber[MAX_PHONE_NUMBER_LENGTH + 1];  //接收到电话号码
char Content[MAX_MESSAGE_CONTENT_LENGTH];     //接收到短信内容


MessageInfo g_sMessageInfo;  //定义一个短信结构体




我在串口2中断中调用给值不正常


 memset(&g_sMessageInfo, 0x0, sizeof(g_sMessageInfo));
 memset(g_sMessageInfo.szRecNumber, 'a',10);
 memset(g_sMessageInfo.szContent, 'a',10);

 memset(RecNumber, 'a',10);
 memset(Content, 'a',10);
 //if(ParseReceiveMessage(pCmdResult, &g_sMessageInfo))
 //{
    #ifdef GPRS_DEBUG
     sprintf(Debug_Str1,"RecNumber: %s\r\n",g_sMessageInfo.szRecNumber);
        DebugPrint(Debug_Str1);
  sprintf(Debug_Str1,"Content: %s\r\n",g_sMessageInfo.szContent);
  DebugPrint(Debug_Str1);
  sprintf(Debug_Str1,"RecNumber: %s\r\n", RecNumber);
        DebugPrint(Debug_Str1);
  sprintf(Debug_Str1,"Content: %s\r\n", Content);
  DebugPrint(Debug_Str1);
       #endif

串口1打印出来结果 
结构体数组打印出来不正常  打印出来不 是 “aaaaaaaaa”
而定义全局串口打打打印出来是正常的  全是“aaaaaaaaa”


当我去掉GPRS.h   结构体   MessageInfo  中  //S_DateTime sRecTime;                           //接收信息时间 
打印就全正常 

这是是什么原因啊????

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

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
 楼主| 发表于 2011-8-24 21:59:15 | 显示全部楼层
用的KEIL是本STM32开发板中的KEIL版本
回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-8-24 21:59:34 | 显示全部楼层
回复【楼主位】mfkqqw:
---------------------------------
加packed试试.
另外,用for这样的赋值方式试试.

如果不是在中断里面调用,问题有么?
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
 楼主| 发表于 2011-8-24 22:05:56 | 显示全部楼层
packed是什么意思?


for 是一样的

难道在中断里不能调用结构体中的变量
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
 楼主| 发表于 2011-8-24 22:08:15 | 显示全部楼层
而我去掉GPRS.h   结构体   MessageInfo  中  //S_DateTime sRecTime;                           //接收信息时间 


打印就正常  

回复 支持 反对

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165352
金钱
165352
注册时间
2010-12-1
在线时间
2108 小时
发表于 2011-8-24 22:09:10 | 显示全部楼层
回复【4楼】mfkqqw:
---------------------------------
中断里面是可以调用的.
packed是类似这样的:
//按钮结构体定义
__packed typedef struct 
{
u16 top;     //按钮顶端坐标
u16 left;                       //按钮左端坐标
u16 width;     //宽度
u16 height; //高度

u8 id; //按钮ID
u8 type; //按钮类型 0,标准按钮;1,图片按钮;2,边角按钮;3,文字按钮(背景透明)
u8 sta; //按钮状态[1:0]:0,激活的(松开);1,按下;2,未被激活的

u8 *caption; //按钮名字
u8 font; //caption文字字体
u16 fcolor;     //文字颜色
u16 *bkctbl; //背景色表(只有在使用透明背景的时候使用)  
}_btn_obj;
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
 楼主| 发表于 2011-8-24 22:45:19 | 显示全部楼层
还有这招?我明天试试
回复 支持 反对

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2011-8-19
在线时间
2 小时
 楼主| 发表于 2011-8-25 09:49:27 | 显示全部楼层
加了__packed  这个真的好了!
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-24 21:33

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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