6750|12

65

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

结构体转为十六进制字符串 [复制链接]

我定义了一个结构体

  1. struct        RS_Data
  2. {
  3.          unsigned        char        cFrameHead;                                        //帧头        0xAA
  4.          unsigned        char        cSeryNo[6];                                        //设备序列号
  5.          unsigned        char        cCommand;                                        //命令字
  6.          unsigned        short        nTotalPackage;                                //总包数
  7.          unsigned        short        CurrentPackage;                                //当前包序号
  8.          unsigned        short        DataSize;                                        //数据长度
  9.          unsigned        char*        DataArray;                                //数据,数据长度为0时,本数据段为空
  10.          unsigned        char        cCheckSun;                                        //校验和
  11.          unsigned        char        cFrameTail;                                        //帧尾        0xAA
  12. };
  13. 然后定义了一个RS_Data类型的变量
  14.         RS_Data        ComuCheckData;
  15.         ComuCheckData.cFrameHead=0xAA;
  16.         ComuCheckData.cSeryNo[0]='1';
  17.         ComuCheckData.cSeryNo[1]='2';
  18.         ComuCheckData.cSeryNo[2]='3';
  19.         ComuCheckData.cSeryNo[3]='4';
  20.         ComuCheckData.cSeryNo[4]='5';
  21.         ComuCheckData.cSeryNo[5]='6';
  22.         ComuCheckData.cCommand=0x20;
  23.         ComuCheckData.nTotalPackage=1;
  24.         ComuCheckData.CurrentPackage=1;
  25.         ComuCheckData.DataSize=0;
  26.         ComuCheckData.DataArray=NULL;
  27.         ComuCheckData.cCheckSun=0x8A;
  28.         ComuCheckData.cFrameTail=0xAA;
复制代码

如何将ComuCheckData变为十六进制的字符串然后通过串口发送出去?
希望能给出具体的实现程序,非常感谢!

最新回复

另:如何知道串口接收到数据,并且已接收完毕?  详情 回复 发表于 2009-7-17 15:54
点赞 关注

回复
举报

63

帖子

0

TA的资源

一粒金砂(初级)

沙发
 

  1. unsigned char * pp;
  2. int i;

  3. pp = &ComuCheckData;

  4. for (i=sizeof(struct RS_Data);i>0;i--)
  5.    uart_sendchar(*pp++);
复制代码


uart_sendchar 是你串口发送一个字节数据的函数
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
需要注意的是,你这样的结构定义出来,编译器默认会做字节对齐.
所以,假如是4字节对齐,sizeof(struct RS_Data)的结果是16而不是15,也就是最后会多发一个0x00出去

串口那头接收的程序将数据流装入结构的话也需要是4字节对齐的.比如delphi的程序默认就是8字节对齐的.所以最好是结构体声明的时候就使用紧缩模式.
 
 
 

回复

85

帖子

0

TA的资源

一粒金砂(初级)

4
 
引用 1 楼 skylkj 的回复:
C/C++ code
unsigned char * pp;
int i;

pp = &ComuCheckData;

for (i=sizeof(struct RS_Data);i>0;i--)
   uart_sendchar(*pp++);




uart_sendchar 是你串口发送一个字节数据的函数

没有将结构体变为十六进制的字符串
每次程序发送一个字符串,并不是一个字节
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 2 楼 skylkj 的回复:
需要注意的是,你这样的结构定义出来,编译器默认会做字节对齐.
所以,假如是4字节对齐,sizeof(struct RS_Data)的结果是16而不是15,也就是最后会多发一个0x00出去

串口那头接收的程序将数据流装入结构的话也需要是4字节对齐的.比如delphi的程序默认就是8字节对齐的.所以最好是结构体声明的时候就使用紧缩模式.

请问如何使用紧缩模式?
 
 
 

回复

58

帖子

0

TA的资源

一粒金砂(初级)

6
 
你还要转成字符串啊...


  1. unsigned char * pp;
  2. int i;
  3. unsigned char buf[2];

  4. pp = &ComuCheckData;

  5. for (i=sizeof(struct RS_Data);i>0;i--)
  6. {
  7.    sprintf(buf,"%2x",*pp++);
  8.    uart_sendbuf(buf,2);
  9. }
复制代码

uart_sendbuf 是你串口发送一个buf的函数


紧缩模式看你用的编译器了,我们使用gcc编译器的话,这样就可以了:

  1. struct  struct_aaa
  2. {       
  3.    unsigned int aaa;
  4. }__attribute__  ((packed));
复制代码


也不是说一定要用紧缩模式啦,只要串口两端的程序约定一样就可以了
 
 
 

回复

65

帖子

0

TA的资源

一粒金砂(初级)

7
 
上面声明改成unsigned char buf[3];
字符串有结束符
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 5 楼 skylkj 的回复:
你还要转成字符串啊...


C/C++ code
unsigned char * pp;
int i;
unsigned char buf[2];

pp = &ComuCheckData;

for (i=sizeof(struct RS_Data);i>0;i--)
{
   sprintf(buf,"%2x",*pp++);
   uart_sendbuf(buf,2);
}



uart_sendbuf 是你串口发送一个buf的函数


紧缩模式看你用的编译器了,我们使用gcc编译器的话,这样就可以了:

C/C++ code
struct  struct_aaa
{   
   unsigned int aaa;
}_…


嗯啊,我发的是字符串,不是一个一个的字符!!
这位同僚再帮我想哈子啊,要能把结构体变十六进制的字符串,并能够将接收到的十六进制字符串还原为结构体
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

9
 

大伙们帮帮忙吧,愁好几天了
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
如果你的结构体是固定,或者变换不是很多的话,写一个小函数完成发送,不一定要变成字符串的吧。
硬要字符串,你也可以自己定义一个字符数组,数组大小是结构体大小加1,然后写个小函数把结构体里的数据一个一个的copy到你的字符数组里,这样也不存在什么对齐的问题吧,最后加一个结束符号。接收端相反。我没试过,这个中间还要注意些什么,请以实验为准。因为字符数组和字符指针的转换有没什么机关,c没学好。
这种东西,方法不固定,如果效率要求不高的话,自己定义个小的协议或者转换方法,对于做软件的人来说应该不难吧。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

11
 
顶上去
 
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

12
 
晕,你先把结构体转成字符串,发送后再把字符串转成结构体.... 直接发送结构体的二进制数据好了.我这里经常做这种东西,从来没用过你这种方法...

"我发的是字符串,不是一个一个的字符!! "
串口发送就是一次一个字节,发送字符串其实也就是一个字符一个字符的发.

sprintf(buf,"%2x",*pp++);
这个之后buf就已经是字符串了.如果你的意思是非要把多个buf拼成一个很长的字符串再一次发送,可以使用strcat函数
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

13
 
另:如何知道串口接收到数据,并且已接收完毕?
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条
【回帖赢京东卡】说说无线技术那些事儿
即日起—2月28日,参与回帖讨论都有机会赢取【30元京东卡】

查看 »

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

 
机器人开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表