OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 334|回复: 8

关于C语言结构体的问题

[复制链接]

  离线 

11

主题

48

帖子

0

精华

新手上路

Rank: 1

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

最佳答案

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

1,结构体定义的时候,前面加__packed关键字。2,指针指向结构体首地址。3,从指针里面依次读取sizeof结构体大小的数据出来,就可以完成你的目标了。
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

110

主题

7273

帖子

12

精华

资深版主

Rank: 8Rank: 8

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

使用道具 举报

  离线 

11

主题

48

帖子

0

精华

新手上路

Rank: 1

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

原子哥,您好!我按照您说的添加了关键字__attribute__ ((__packed__)),现在不会死机了,但是输出的数据只有第一个是对的,其余的都不知道是什么意思,请问这个是什么意思呢?
[C] 纯文本查看 复制代码
 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;


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

使用道具 举报

  离线 

11

主题

48

帖子

0

精华

新手上路

Rank: 1

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

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

使用道具 举报

  离线 

4

主题

98

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
349
金钱
349
注册时间
2015-9-16
在线时间
98 小时
发表于 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个字节
回复

使用道具 举报

  离线 

11

主题

48

帖子

0

精华

新手上路

Rank: 1

积分
20
金钱
20
注册时间
2016-12-3
在线时间
18 小时
 楼主| 发表于 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 的第一个变量也是指针。
回复

使用道具 举报

  离线 

1

主题

4

帖子

0

精华

新手上路

Rank: 1

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

使用道具 举报

  离线 

0

主题

58

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

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

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-21 18:17

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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