打印

串口通信数据解析头问题

[复制链接]
8362|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++;
...

指针和数组差不多,如果使用结构体方式要注意字节序。

使用特权

评论回复
5
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中,谢谢

使用特权

评论回复
6
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;

使用特权

评论回复
7
bywind|  楼主 | 2010-4-20 10:05 | 只看该作者
谢谢
a.a1 = (*((STRUCT_X *)(void *)Temp)).x;
b.b2 = (*((STRUCT_X *)(void *)Temp)).y;
如何可以连续操作赋值,不要一个一个的赋值?

使用特权

评论回复
8
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;
}

使用特权

评论回复
9
bywind|  楼主 | 2010-4-20 10:15 | 只看该作者
哈哈,谢谢,这个没有规律的

使用特权

评论回复
10
bywind|  楼主 | 2010-4-20 10:17 | 只看该作者
如上所写,xxx每次是指向不同的结构体a.a1,b.b2,xxx得为变量

使用特权

评论回复
11
zq1987731| | 2010-4-20 10:20 | 只看该作者
其实通讯协议处理,“字节流”只存在于发送及接收的过程中,而一般数据帧按struct+union的形式处理会容易些,其中union可以解决一些“不同”的情况,程序的可读性也会好些

使用特权

评论回复
12
bywind|  楼主 | 2010-4-20 10:25 | 只看该作者
谢谢

使用特权

评论回复
13
津sgb996442717| | 2010-4-20 11:08 | 只看该作者
不错啊

使用特权

评论回复
14
bywind|  楼主 | 2010-4-20 11:11 | 只看该作者
这种情通况在通信中外,在其它地方也有的,比如
从eeprom中读取数据比如c[32],要把c中的的连续字节数数据赋值给不同结构体中的部分或全部数据变量

使用特权

评论回复
15
原野之狼| | 2010-4-20 11:40 | 只看该作者
注意一下 需要考虑变量在内存中的存储模型 不同的软硬件平台是不一样的

使用特权

评论回复
16
hondephy| | 2010-4-20 12:28 | 只看该作者
受教了。。

使用特权

评论回复
17
qiaojoly| | 2010-4-20 13:17 | 只看该作者
不错啊,看一下:(

使用特权

评论回复
18
supply-pcb| | 2010-4-20 14:18 | 只看该作者
试下。

使用特权

评论回复
19
edward8421| | 2010-4-20 14:20 | 只看该作者
4楼方法简单易行,我实际做的方法也是这样,数组和指针原理相同,但是数组更容易理解一些。

使用特权

评论回复
20
zhuhai2004| | 2010-4-20 17:26 | 只看该作者
强制转换,在不同的平台可能会出现问题。比如对齐方式、大小端的存储方式会有影响。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

7

帖子

1

粉丝