打印

单片机串口发数据包问题

[复制链接]
3469|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
puppet21|  楼主 | 2013-9-23 09:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我定义了一个数据包
typedef struct DataBag
{
         int baghand;
         int bagstyle;
         char dataout ;
};
大概是这么一个东东,我要把数据通过串口发送出去,请问一下大神们要怎么把自定义的数据类型通过TXD口发送出去,并能被对方接收。
直接databag = SBUF,会报错,类型不匹配!
求教求教

相关帖子

沙发
NE5532| | 2013-9-23 10:04 | 只看该作者
串口帧是Byte为单位的,所以SBUF当然也是Char型,你一个Int型上去当然报错。你只有用指针了,用一个Char型指针指向Baghand,然后来发,但是你要想办法判断包怎么算发完。

PS:包头是PackageHead,楼主写的Chinglish啊~!

使用特权

评论回复
板凳
dirtwillfly| | 2013-9-23 10:07 | 只看该作者
收到后再还原成原有格式不就行了嘛?
一般情况,不管什么类型的数据,在存储器中都是连续存放的

使用特权

评论回复
地板
hotyong| | 2013-9-23 10:50 | 只看该作者
最简单的就是指针,一字节一字节出去,
或者建立一个全是byte的共同体,一字节一字节出去

使用特权

评论回复
5
puppet21|  楼主 | 2013-9-23 11:10 | 只看该作者
dirtwillfly 发表于 2013-9-23 10:07
收到后再还原成原有格式不就行了嘛?
一般情况,不管什么类型的数据,在存储器中都是连续存放的 ...

就是在接收后如何还原数据包?怎么把零碎的的字节放到一个连续的空间?求代码例子

使用特权

评论回复
6
puppet21|  楼主 | 2013-9-23 11:14 | 只看该作者
NE5532 发表于 2013-9-23 10:04
串口帧是Byte为单位的,所以SBUF当然也是Char型,你一个Int型上去当然报错。你只有用指针了,用一个Char型 ...

如果用指针指向*p=databag.baghand;那么怎么发送databag.bagstyle?p++?

使用特权

评论回复
7
puppet21|  楼主 | 2013-9-23 11:15 | 只看该作者
hotyong 发表于 2013-9-23 10:50
最简单的就是指针,一字节一字节出去,
或者建立一个全是byte的共同体,一字节一字节出去 ...

还是那个问题,怎么还原?

使用特权

评论回复
8
NE5532| | 2013-9-23 11:30 | 只看该作者
puppet21 发表于 2013-9-23 11:14
如果用指针指向*p=databag.baghand;那么怎么发送databag.bagstyle?p++?

对,指针要用强制类型转换成Char型,不然编译还要出错的。最保险的办法是用共用体拆分int型数据来发送,后面的Char型数据就直接用Char型指针指着发。

使用特权

评论回复
9
puppet21|  楼主 | 2013-9-23 11:36 | 只看该作者
NE5532 发表于 2013-9-23 11:30
对,指针要用强制类型转换成Char型,不然编译还要出错的。最保险的办法是用共用体拆分int型数据来发送, ...

我觉得这样发送很不安全,是不是接收系统要收完包内所有数据再判断?还有的是,数据包在接收系统怎么还原?如果有一个数据丢失,那不是整份包都不能用了?

我现在用的方式是用连续的数据报,一条一条发,第一条打开子系统接收通道,不是目标的子系统直接忽略剩下的数据。

使用特权

评论回复
10
NE5532| | 2013-9-23 15:49 | 只看该作者
要么定长传输,要么在数据包里带长度。另外串口出错的概率楼主不用考虑了,跟中500万差不多。

使用特权

评论回复
11
ayb_ice| | 2013-9-23 17:16 | 只看该作者
想法不错,数据往串口一丢,全自动发出去了

使用特权

评论回复
12
hotyong| | 2013-9-24 11:28 | 只看该作者
puppet21 发表于 2013-9-23 11:15
还是那个问题,怎么还原?

VC中运行过的代码。

#include "stdio.h"


typedef struct DataBag
{
         int baghand;
         int bagstyle;
         char dataout ;
}DATABAG;


DATABAG dg_tx;

DATABAG * p_dg_rx;

main()
{
        char * ptx;        /*发送指针*/

        int i;

        char tx_buf[100];
        char rx_buf[100];

        dg_tx.baghand = 1234;
        dg_tx.bagstyle = 5678;
        dg_tx.dataout = 90;

        ptx = (char *)(&dg_tx);

        for(i=0;i<sizeof(dg_tx);i++)
        {
                        tx_buf=*ptx++;                                /*模仿发送*/
                        rx_buf=tx_buf;                        /*这里模仿接收字节*/                       
        }

        /*将接收缓存指针给接收结构体,实际是完成数据转换*/
        p_dg_rx = (DATABAG *)rx_buf;

        printf("\r\n%d,%d,%d\r\n",p_dg_rx->baghand,p_dg_rx->bagstyle,p_dg_rx->dataout);
}

使用特权

评论回复
13
puppet21|  楼主 | 2013-9-24 14:17 | 只看该作者
hotyong 发表于 2013-9-24 11:28
VC中运行过的代码。

#include "stdio.h"

懂~!非常明白~!不过就需要判断一下包尾了~!

使用特权

评论回复
14
cos12a| | 2013-9-29 17:28 | 只看该作者
:victory:简洁明了.

使用特权

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

本版积分规则

16

主题

140

帖子

0

粉丝