4633|9

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于解读串口设备返回的数据问题,请帮忙看看,如何把根据协议把A9 03解析为937…… [复制链接]

通讯是RS485协议,其中关于返回数据的格式如下:
SM 返回: DATAINFO(9字节):
                桶底BOTTOM(2字节);
                下一次新记录存放指针 SAVEP(2字节);
                下一次读取记录位置指针 LOADP(2字节)               
                SM已修改LOADP标志MF (1字节)(D0=0 未修改)。
柜桶最大深度MAXLEN(2字节);

程序从串口设备读到的返回的DATAINFO数据为:
00 00 A9 03 7D 05 80 40 09
(HEX:3030 3030 4139 3033 3744 3035 3830 3430 3039)
(对应的实际数据:0 937 1405 128 2368)

00 00 AD 03 7D 05 80 40 09(对应的实际数据:0 941 1405 128 2368)

00 00 B1 03 7E 05 80 40 09(对应的实际数据:0 945 1406 128 2368)



实在是没办法  研究了半天

最新回复

谈到字节排序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。ARM同时支持 big和little,实际应用中通常使用little endian。那么究竟什么是big endian,什么又是little endian呢?       其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示: Big Endian 一个Word中的高位的Byte放在内存中这个Word区域的低地址处 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 12 | 34 | 56 | 78 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ Little Endian 一个Word中的低位的Byte放在内存中这个Word区域的低地址处 低地址 高地址 -----------------------------------------> +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ | 78 | 56 | 34 | 12 | +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+       从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。必须注意的是:一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。   详情 回复 发表于 2009-4-9 14:28
点赞 关注

回复
举报

3

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
对应的实际数据  是我用WINFROM下用DLL写好的程序和设备通讯 监听得到的数据
现在做的是要在WINCE下直接发送命令和设备通讯  没有DLL调用 郁闷坏了 直接摸索通讯协议 那个苦啊……
好不容易把发送读取搞定  在解析数据又卡住了  还望大家帮忙……
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
这个也没什么复杂的,可以看出来你的数据是也双字节为宽度的,首先把你接收到得数据按顺序全部放入到一个数组中,然后定义一个 unsigned short 或者 short (根据你的数据的需要)指针pData指向这个数组,然后你你依次打印*pData, *(pData+1), *(pData+2), ...... 的值看看是不是就是你需要的值了。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

4
 
看了半天,还是没看明白
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
@xajhuang
没太明白 你的意思是说把数据直接累加还是?
数据在返回时是数组 我转换成字符串的
比如说 A9 03 对应实际的 SAVEP 是 937  ;那到底该如何转换呢

@yashi
也许是我没描叙太清楚 实际上我想问的是如何把读到的数据转换成该协议提供的实际数据
就类似与 A9 03 HEX为41 39  而我要得到的数据是 937  
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
就是不清楚设备把实际存储的数据做了什么处理才传回来
类似把 ASCII码 高低位转换 HEX转十进制 都对不出数据……
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

7
 
  1. #pragma pack(1)
  2. typedef struct datainfo {
  3.   unsigned short  bottom;
  4.   unsigned short  savep;
  5.   unsigned short  loadp;
  6.   unsigned char   flags;
  7.   unsigned short  maxlen;
  8. } DATAINFO;
  9. #pragma pack()

  10. char buf[] = {00, 00, A9, 03, 7D, 05, 80, 40, 09};
  11. DATAINFO *pdi = (DATAINFO *)buf;

  12. //用下面的结构成员就可以使用该数据。如果有字节顺序,可以采用 htons 和 ntohs 进行转换:

  13.   pdi->bottom;
  14.   pdi->savep;
  15.   pdi->loadp;
  16.   pdi->flags;
  17.   pdi->maxlen;

复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

8
 
你用的 little endian 模式的cpu,所以:

savep = 数组中[A9 03] = 0x03a9 = 937
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

9
 
啊啊 果然……
从WEB活生生逼到ARM上读串口 实在是修为不足啊,了解下endian 模式去
结贴
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

10
 
谈到字节排序的问题,必然牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据。ARM同时支持 big和little,实际应用中通常使用little endian。那么究竟什么是big endian,什么又是little endian呢?
      其实big endian是指低地址存放最高有效字节(MSB),而little endian则是低地址存放最低有效字节(LSB)。用文字说明可能比较抽象,下面用图像加以说明。比如数字0x12345678在两种不同字节序CPU中的存储顺序如下所示:

Big Endian
一个Word中的高位的Byte放在内存中这个Word区域的低地址处

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 12 | 34 | 56 | 78 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

Little Endian
一个Word中的低位的Byte放在内存中这个Word区域的低地址处

低地址 高地址
----------------------------------------->
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| 78 | 56 | 34 | 12 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

      从上面两图可以看出,采用big endian方式存储数据是符合我们人类的思维习惯的。必须注意的是:一个Word的长度是16位,一个Byte的长度是8位。如果一个数超过一个Word的长度,必须先按Word分成若干部分,然后每一部分(即每个Word内部)按Big-Endian或者Little-Endian的不同操作来处理字节。

 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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

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

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

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