OpenEdv-开源电子网

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

关于C语言结构体的问题

[复制链接]

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
发表于 2017-9-28 17:16:32 | 显示全部楼层 |阅读模式
10金钱
各位大侠好,小弟在写单片机的串口通讯的时候需要用到将结构体里面的数据通过串口输出出来,我采用的办法是定义一个结构体指针 然后使用memcpy()来该地址的数据拷贝出来。我想采用for循环来拷贝数据,使用前将指针指向结构体首地址,并且在每次拷贝完成后指针自加1。问题就来了,单片机会死机,感觉是这个指针没有按照我想象中的将结构体里面的数挨着挨着输出出来。只要对结构体的指针进行了位移操作,就会死机。请问如果想挨着挨着输出结构体的所有数据应该怎么做才能达到我的想法呢? 求各位大侠帮帮忙。

最佳答案

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

1,结构体定义的时候,前面加__packed关键字。2,指针指向结构体首地址。3,从指针里面依次读取sizeof结构体大小的数据出来,就可以完成你的目标了。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2017-9-28 17:16:33 | 显示全部楼层
1,结构体定义的时候,前面加__packed关键字。2,指针指向结构体首地址。3,从指针里面依次读取sizeof结构体大小的数据出来,就可以完成你的目标了。
回复

使用道具 举报

120

主题

7877

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12010
金钱
12010
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-9-28 17:30:18 | 显示全部楼层
结构体就是一个数组,可以这么理解,按照数组的操作来就是了
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-9-29 11:07:37 | 显示全部楼层
正点原子 发表于 2017-9-28 17:16
1,结构体定义的时候,前面加__packed关键字。2,指针指向结构体首地址。3,从指针里面依次读取sizeof结构 ...

原子哥,您好!我按照您说的添加了关键字__attribute__ ((__packed__)),现在不会死机了,但是输出的数据只有第一个是对的,其余的都不知道是什么意思,请问这个是什么意思呢?
[mw_shl_code=c,true] struct piledatansr
  {
    unsigned char bStaNum;
    unsigned char bDataType;
    unsigned char WN;
    unsigned char SOW;
}__attribute__ ((__packed__));

struct piledatansr piledatansr_1;
  struct piledatansr *pilepointer;
  pilepointer=&piledatansr_1;
  unsigned char msg[250];

piledatansr_1.bStaNum=0xAA;
  piledatansr_1.bDataType=0x01;
  piledatansr_1.WN=0x20;
  piledatansr_1.SOW=0x30;

for(x=0;x<4;x++)
  {
    memcpy(msg,pilepointer+x,sizeof(piledatansr_1));//将结构体数据导入输出数组中
    nmea_send_outmsg(msg, 1, CPU_USAGE_NMEA_MSG);//输出msg的1个字节
  }
  if(x==4)
    pilepointer=&piledatansr_1;[/mw_shl_code]

这样通过串口调试助手看到的数据是AA 10 A5 55  不知道为什么呢?求原子哥指教!谢谢您!
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-9-29 11:08:43 | 显示全部楼层
八度空间 发表于 2017-9-28 17:30
结构体就是一个数组,可以这么理解,按照数组的操作来就是了

我就是按照数组的操作的呢,首先将指针指向数组 输出后再+1 他指向的就不是结构体的下一个成员了的呢?
回复

使用道具 举报

5

主题

105

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
419
金钱
419
注册时间
2015-9-16
在线时间
122 小时
发表于 2017-9-29 11:33:31 | 显示全部楼层

    memcpy(msg,piledatansr_1,sizeof(piledatansr_1));//将结构体数据导入输出数组中
   for(x=0;x<4;x++)
    nmea_send_outmsg(msg[x], 1, CPU_USAGE_NMEA_MSG);//输出msg的1个字节
回复

使用道具 举报

14

主题

55

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2016-12-3
在线时间
21 小时
 楼主| 发表于 2017-9-30 09:41:32 | 显示全部楼层
dozm 发表于 2017-9-29 11:33
memcpy(msg,piledatansr_1,sizeof(piledatansr_1));//将结构体数据导入输出数组中
   for(x=0;x

这个有些问题吧?memcpy的变量是指针,然后那个nmea_send_outmsg 的第一个变量也是指针。
回复

使用道具 举报

3

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2017-2-6
在线时间
13 小时
发表于 2017-10-25 15:29:42 | 显示全部楼层
copy 1次,for循环显示。
QQ截图20171025152757.png
回复

使用道具 举报

0

主题

207

帖子

0

精华

高级会员

Rank: 4

积分
959
金钱
959
注册时间
2017-5-27
在线时间
108 小时
发表于 2017-10-25 16:48:20 | 显示全部楼层
oywjex 发表于 2017-9-29 11:07
原子哥,您好!我按照您说的添加了关键字__attribute__ ((__packed__)),现在不会死机了,但是输出的数据 ...

结构体取指针+x,才是想要的
TIM图片20171025164723.png
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 04:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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