串口通信数据解析头问题

[复制链接]
9457|20
 楼主| bywind 发表于 2010-4-19 23:15 | 显示全部楼层 |阅读模式
串口通信收到一串连续字节数据流,这流也有完整协议
串数据流中包含有多个数字,比如数据域中第1,2字节构成一个int变量要赋值组变量a,又第3,4,5,6构成一个long变量要赋值给变量b,等,如何把串中的字节流逐一提取出来给a,b,...等,同样也有发送的问题。谢。
zq1987731 发表于 2010-4-20 00:09 | 显示全部楼层
建一个结构体,例如
typedef struct
{
    unsigned int a;
    unsigned long b;
}STRUCT_X;
然后定义:
STRUCT_X send_data;
再然后...把下面这东西作为【字节流首地址】使用...接收么一样的道理
(unsigned char *)(void *)&send_data
ayb_ice 发表于 2010-4-20 08:34 | 显示全部楼层
指针是万能药
john_light 发表于 2010-4-20 09:03 | 显示全部楼层
本帖最后由 john_light 于 2010-4-20 11:09 编辑

当然也可以全部收到缓冲区后再逐个字节拼起来。

以缓冲区RcvBuf为例:
unsigned char RcvBuf[100];
unsigned int a;
unsigned long b;
unsigned char offset;


...
offset = 0;

a = RcvBuf[offset];
offset++;
a <<= 8;
a |= RcvBUf[offset];
offset++;

b = RcvBuf[offset];
offset++;
b <<= 8;
b |= RcvBuf[offset];
offset++;
b <<= 8;
b |= RcvBuf[offset];
offset++;
b <<= 8;
b |= RcvBuf[offset];
offset++;
...

指针和数组差不多,如果使用结构体方式要注意字节序。
 楼主| bywind 发表于 2010-4-20 09:47 | 显示全部楼层
谢谢,如题
现在结构a,b
如str a
{
   int a1,
  long a2
}

str b
{
  long b1,
  uint32 b2
}
如数据流中第1,2字节为结构a中的a1,而第3,4,5,6字节为结构b中的b2,那如何把数据流中的数据更新到a.a1和b.b2中,谢谢
zq1987731 发表于 2010-4-20 09:59 | 显示全部楼层
首先你应该【为这个字节流定个结构体】,2楼那个在这里正好符合
typedef struct
{
    unsigned int x;
    unsigned long y;
}STRUCT_X;

假设你字节流如下定义:
char Temp[XXX];
那么
a.a1 = (*((STRUCT_X *)(void *)Temp)).x;
b.b2 = (*((STRUCT_X *)(void *)Temp)).y;
 楼主| bywind 发表于 2010-4-20 10:05 | 显示全部楼层
谢谢
a.a1 = (*((STRUCT_X *)(void *)Temp)).x;
b.b2 = (*((STRUCT_X *)(void *)Temp)).y;
如何可以连续操作赋值,不要一个一个的赋值?
zq1987731 发表于 2010-4-20 10:11 | 显示全部楼层
如果你的字节流是如此排列:
int long int long int long int long int long...
那么可以用个for循环批量赋值
for(i = 0; i < XXX; i++)
{
    XXX = (((STRUCT_X *)(void *)Temp)[i]).x;
    XXX = (((STRUCT_X *)(void *)Temp)[i]).y;
}
 楼主| bywind 发表于 2010-4-20 10:15 | 显示全部楼层
哈哈,谢谢,这个没有规律的
 楼主| bywind 发表于 2010-4-20 10:17 | 显示全部楼层
如上所写,xxx每次是指向不同的结构体a.a1,b.b2,xxx得为变量
zq1987731 发表于 2010-4-20 10:20 | 显示全部楼层
其实通讯协议处理,“字节流”只存在于发送及接收的过程中,而一般数据帧按struct+union的形式处理会容易些,其中union可以解决一些“不同”的情况,程序的可读性也会好些
 楼主| bywind 发表于 2010-4-20 10:25 | 显示全部楼层
津sgb996442717 发表于 2010-4-20 11:08 | 显示全部楼层
不错啊
 楼主| bywind 发表于 2010-4-20 11:11 | 显示全部楼层
这种情通况在通信中外,在其它地方也有的,比如
从eeprom中读取数据比如c[32],要把c中的的连续字节数数据赋值给不同结构体中的部分或全部数据变量
原野之狼 发表于 2010-4-20 11:40 | 显示全部楼层
注意一下 需要考虑变量在内存中的存储模型 不同的软硬件平台是不一样的
hondephy 发表于 2010-4-20 12:28 | 显示全部楼层
受教了。。
qiaojoly 发表于 2010-4-20 13:17 | 显示全部楼层
不错啊,看一下:(
supply-pcb 发表于 2010-4-20 14:18 | 显示全部楼层
试下。
edward8421 发表于 2010-4-20 14:20 | 显示全部楼层
4楼方法简单易行,我实际做的方法也是这样,数组和指针原理相同,但是数组更容易理解一些。
zhuhai2004 发表于 2010-4-20 17:26 | 显示全部楼层
强制转换,在不同的平台可能会出现问题。比如对齐方式、大小端的存储方式会有影响。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部