OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3544|回复: 4

关于灵活地发送数据

[复制链接]

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
发表于 2015-7-4 10:55:33 | 显示全部楼层 |阅读模式
5金钱
比如有以下通信协议(全部是字符串,http协议就是类似这样的):
<目的地址名称>\r\n\
<功能名称>\r\n\
<时间>\r\n\
<数据>\r\n\
每行的字符个数是不确定的,因此如果整成一个大字符串的话灵活性很不好,如果分次发送的话是不是会造成对方认为是丢数据了?比如http协议,服务器是不是认为分次发就是错误的???

最佳答案

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

//发送的数据结构  typedef struct { unsigned char name[20]; unsigned char time[20]; unsigned int dataLen; unsigned char data[100]; }_data; //数据结构实例化 _data sendData; //装入名称数据, unsigned char tmp[]="myname"; unsigned char *p; p = tmp; for(char i=0; i<( sizeof(tmp)); i++) { sendData.name = *p; p++; } //装入时间数据 unsigned char tmp2[] = "2015.06.33.18:20" ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2015-7-4 10:55:34 | 显示全部楼层
//发送的数据结构
 typedef struct
{
unsigned char name[20];
unsigned char time[20];
unsigned int dataLen;
unsigned char data[100];
}_data;

//数据结构实例化
_data sendData;

//装入名称数据,
unsigned char tmp[]="myname";
unsigned char *p;
p = tmp;
for(char i=0; i<( sizeof(tmp)); i++)
{
sendData.name = *p;
p++;
}

//装入时间数据
unsigned char tmp2[] = "2015.06.33.18:20";
p = tmp2;
for(char i=0; i<( sizeof(tmp2)); i++)
{
    sendData.time = *p;
    p++;
}

//假定你的数据长度是这样
sendData.dataLen = 33;

//发送数据
//第一个20是你name字节数,第二个20是time字节数,2是数据长度的字节数(int 2字节),再加上数据长度
Usart2XmtData((unsigned char *)(&(sendData.name[0])), (20 +20 + 2 + sendData.dataLen));
回复

使用道具 举报

2

主题

84

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
214
金钱
214
注册时间
2014-12-29
在线时间
36 小时
发表于 2015-7-4 11:07:14 | 显示全部楼层
一般的数据是有固定长度的地址、名称、时间等,也有不固定长度的具体数据字等。
最简单的处理方式吧你的
<目的地址名称>\r\n\
<功能名称>\r\n\
<时间>\r\n\
长度和格式固定下来
struct
{
    <目的地址名称>\r\n\
    <功能名称>\r\n\ 
    <时间>\r\n\
    <数据长度>\r\n
    <数据>\r\n\
}

最后是数据,你自己需要发送的数据是应该知道长度的对吧,单后就发总这个struct就行了,发送长度就是你的固定长度+数据长度

最简单的参考ModBus协议,http有自己的数据打包方式,也可以参考
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-7-4 14:39:10 | 显示全部楼层
回复【2楼】hhlh2l:
---------------------------------
能结合下面的例子讲解下吗?
我现在有串口发送函数 Usart2XmtData(u8 *data, u16 datalen);
比如要一次性发送下面数据:

定义struct 
{
   u8 a[15];
   u8 b[16];
   u8 c[12];
   u8 d[2];
}
qwer=
{
    "www.openedv.com",
    "2015/07/04 14:22",//时间,值会变,但长度不变
    "woshizhi=124",//数据,值会变 0-999,长度也会变
    "\r\n"//结束
};
回复

使用道具 举报

145

主题

445

帖子

0

精华

高级会员

Rank: 4

积分
823
金钱
823
注册时间
2014-1-15
在线时间
350 小时
 楼主| 发表于 2015-7-4 16:29:02 | 显示全部楼层
回复【4楼】hhlh2l:
---------------------------------
谢谢。
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 19:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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