OpenEdv-开源电子网

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

真的没头绪了,结构体赋值直接报错

[复制链接]

1

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-23
在线时间
4 小时
发表于 2020-6-23 23:36:51 | 显示全部楼层 |阅读模式
1金钱
希望大神们看一眼,真的没招了。。。。
定义了一个结构体如下
__packed typedef struct
{   
        char Socketnum[3];                                                           //socket
        uint16_t data_len_unread;                                   //all data length
  char recdata[UART3_BUFF_SIZE-13];
} struct_ec20;


同时定义了一个一个子函数
char EC20_TCP(struct_ec20 *var_sever_name, char *var_ip_addr, char *var_port_no, char var_soc_no)
{       
        char string_Send[50];
        //var_sever_name->Socketnum=13;
        sprintf(string_Send, "AT+QICLOSE=%d\r\n",var_soc_no);
        Send_AT(string_Send,"OK","ERROR",1,1);
        sprintf(string_Send, "AT+QIOPEN=1,%d,\042TCP\042,%s,%s,0,0\r\n",var_soc_no,var_ip_addr,var_port_no);// buffer mode
        if(!Send_AT(string_Send,"+QIOPEN",NULL,100,1)) return 1; //create socket
        else
        {
                if(strx[10]==',' )
                {
                        if(strx[11]=='0')
                        {
                                //temp_no=(u8)(strx[9]-'0');
                                var_sever_name->Socketnum[0]=strx[9];
                                var_sever_name->Socketnum[0]=0;
                        }
                        else  return 0;
                }
                else if(strx[11] ==',')
                {
                        if(strx[12]=='0')
                        {       
                                var_sever_name->Socketnum[0]=strx[9];
                                var_sever_name->Socketnum[1]=strx[10];
                        }
                        else  return 0;
                }
        }
        return 3;       
}


在main.c 中定义了一个全局变量, struct_ec20 glb_ec20_plat;
然后调用上面的子函数
led1_sta_flag=EC20_TCP(&glb_ec20_plat,IP_ADDR_PLATFORM,PORT_ADDR_PLATFORM,1);

问题是
子函数运行到这一步就会进入HardFault_Handler,
var_sever_name->Socketnum[0]=0;


之前定义了socketnumb 为int,然后直接赋值,赋值为1可以,但是要是赋值为var_sever_name->Socketnum=strx[0]-‘0’就不可以,其中strx[0]=0x31

最佳答案

查看完整内容[请看2#楼]

试试在函数里定义一个struct_ec20 *GLB_ec20_plat = glb_ec20_plat;后面的操作用GLB_ec20_plat这个指针
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

11

主题

2149

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4930
金钱
4930
注册时间
2015-1-10
在线时间
618 小时
发表于 2020-6-23 23:36:52 | 显示全部楼层
试试在函数里定义一个struct_ec20  *GLB_ec20_plat = glb_ec20_plat;后面的操作用GLB_ec20_plat这个指针
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-23
在线时间
4 小时
 楼主| 发表于 2020-6-23 23:38:23 | 显示全部楼层
加一个var_sever_name->Socketnum=(u8)(strx[0]-‘0’)也不行
回复

使用道具 举报

7

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
317
金钱
317
注册时间
2017-9-16
在线时间
80 小时
发表于 2020-6-24 13:11:57 | 显示全部楼层
本帖最后由 ISO14882 于 2020-6-24 13:28 编辑

可能是某些非对齐访问可能会引发hard fault,要看一下反汇编和符号表。。不过你用了packed应该不会出问题。。
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-23
在线时间
4 小时
 楼主| 发表于 2020-6-24 20:37:41 | 显示全部楼层
阿侑kevin 发表于 2020-6-24 11:28
试试在函数里定义一个struct_ec20  *GLB_ec20_plat = glb_ec20_plat;后面的操作用GLB_ec20_plat这个指针

大牛!!先佩服一下外加谢谢
我发现可能也是这个问题。函数中有调用另外一个函数
Send_AT(string_Send,"+QIOPEN",NULL,100,1),当调用完后返回后var_sever_name这个指针就变化了。

我试了,在函数EC20_TCP()里面加struct_ec20  *GLB_ec20_plat = var_sever_name;达不到效果,在跳转到其他函数后仍然会丢失地址
声明一个static struct_ec20  *GLB_ec20_plat = var_sever_name 就可以了
或者在这个C文件里声明一个全局变量也可以

顺便问下大牛, struct_ec20  *GLB_ec20_plat声明这个会占用很大的ram么?因为这个结构体里有一个大数组。如果有相关的博文,也可以推荐一下,谢谢
回复

使用道具 举报

1

主题

11

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2020-6-23
在线时间
4 小时
 楼主| 发表于 2020-6-24 20:38:53 | 显示全部楼层
ISO14882 发表于 2020-6-24 13:11
可能是某些非对齐访问可能会引发hard fault,要看一下反汇编和符号表。。不过你用了packed应该不会出问题。 ...

谢谢回复,不是对齐的问题,是调用其他的函数,传递的地址丢了,声明一个指针,存住了就行了
回复

使用道具 举报

33

主题

1628

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
6679
金钱
6679
注册时间
2015-8-25
在线时间
1036 小时
发表于 2020-6-24 21:48:22 | 显示全部楼层
你应该不是这个问题,就你的描述来说你的C语言的用法没问题,很像是那里那里数组越界了
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-16 06:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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