OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子全套STM32/FPGA开发资料,上千讲STM32视频教程,RT1052教程免费下载啦...
查看: 803|回复: 8
打印 上一主题 下一主题

关于C语言结构体的问题

[复制链接]

  离线 

12

主题

51

帖子

0

精华

新手上路

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

最佳答案

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

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

回复

使用道具 举报

  离线 

516

主题

9万

帖子

31

精华

管理员

Rank: 12Rank: 12Rank: 12

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

使用道具 举报

  离线 

116

主题

7649

帖子

12

精华

资深版主

Rank: 8Rank: 8

积分
11213
金钱
11213
注册时间
2013-9-10
在线时间
369 小时
3#
发表于 2017-9-28 17:30:18 | 只看该作者
结构体就是一个数组,可以这么理解,按照数组的操作来就是了
回复

使用道具 举报

  离线 

12

主题

51

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-12-3
在线时间
20 小时
4#
 楼主| 发表于 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  不知道为什么呢?求原子哥指教!谢谢您!
回复

使用道具 举报

  离线 

12

主题

51

帖子

0

精华

新手上路

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

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

使用道具 举报

  离线 

4

主题

101

帖子

0

精华

中级会员

Rank: 3Rank: 3

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

使用道具 举报

  离线 

12

主题

51

帖子

0

精华

新手上路

积分
23
金钱
23
注册时间
2016-12-3
在线时间
20 小时
7#
 楼主| 发表于 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

积分
53
金钱
53
注册时间
2017-2-6
在线时间
13 小时
8#
发表于 2017-10-25 15:29:42 | 只看该作者
copy 1次,for循环显示。

QQ截图20171025152757.png (23.95 KB, 下载次数: 0)

QQ截图20171025152757.png
回复

使用道具 举报

  离线 

0

主题

190

帖子

0

精华

高级会员

Rank: 4

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

结构体取指针+x,才是想要的

TIM图片20171025164723.png (18.55 KB, 下载次数: 0)

TIM图片20171025164723.png
回复

使用道具 举报

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

本版积分规则




关闭

正点原子双11大促销上一条 /1 下一条

正点原子公众号

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

GMT+8, 2018-11-20 08:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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