查看: 1347|回复: 3

[其他] 每天解决一个问题23:自己定义通信协议一问一答

[复制链接]
  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
    发表于 2015-9-15 23:07:03 | 显示全部楼层 |阅读模式
    本帖最后由 suoma 于 2015-9-15 23:08 编辑

    想用nRF905实时的发送温湿度数据怎么编程,接收端用液晶显示怎么处理这些数据 高手指点一下
    答:NRF905是SPI接口的,调好能够传送数据和发送,然后定义一个简单的数据协议就可以了。
    数据协议大概要怎么定义?温湿度的数据大概四个字节  用一个数组存放吗 谢谢
    答:嗯嗯,用一个8个字节来存放。其中包括帧头,数据,帧尾,校验
    几个字节你自己定义,这是举例


    在主程序里把设置成发送模式他就能自动把数据发出去了吗
    答:那得看你的发送模式设置函数是不是对发送使能等寄存器值为1了。
    这两个寄存器使能就是启动发送TRX_CE、TX_EN
    void Data_Send_Status(void)
    {
            uint8_t _cnt=11;
            data_to_send[0]=0xAA;
            data_to_send[1]=0xAA;
            data_to_send[2]=0x01;
            data_to_send[3]=0;
            vs16 _temp;
            _temp = (int)(Att_Angle.rol*100);
            data_to_send[4]=BYTE1(_temp);
            data_to_send[5]=BYTE0(_temp);
            _temp = (int)(Att_Angle.pit*100);
            data_to_send[6]=BYTE1(_temp);
            data_to_send[7]=BYTE0(_temp);
            _temp = (int)(Att_Angle.yaw*100);
            //_temp = (int)(Mag_Heading*100);
            data_to_send[8]=BYTE1(_temp);
            data_to_send[9]=BYTE0(_temp);

            if(Rc_C.ARMED==0)                        data_to_send[10]=0xA0;        
            else if(Rc_C.ARMED==1)                data_to_send[10]=0xA1;
            
            data_to_send[3] = _cnt-4;
            uint8_t sum = 0;
            for(uint8_t i=0;i<_cnt;i++)
                    sum += data_to_send;
            data_to_send[_cnt++]=sum;
    #ifdef DATA_TRANSFER_USE_USART
            Uart1_Put_Buf(data_to_send,_cnt);
    #else
            NRF_TxPacket(data_to_send,_cnt);
    #endif
    }
    这是一个简单高效的通信协议,你看看。

    那对面接收单片机的地址是怎么确定的呢   
    答:对接收到数据存到一个数组里,查找帧头        data_to_send[0]=0xAA;
            data_to_send[1]=0xAA;
            data_to_send[2]=0x01;
    找到后,按照接收到数据个数再跳转到帧尾,判断是否准确,然后再做for(uint8_t i=0;i<_cnt;i++)
                    sum += data_to_send;
            data_to_send[_cnt++]=sum;
    累加和校验
    校验数据结果和data_to_send[_cnt++]对比,正确就是接收成功,到数组的指定位置提取数据即可,发现数据不对,可以要求重发或者丢弃。
      我用的是AM2301的温湿度传感器 它里面好像已经有校验了
    答:那是温湿度传感器和你单片机的数据通信,跟你无线数据包时两码事,如果你对精度和准确率要求不高,可以不需要校验。

    哦哦  要求不高能达到实时传送?
    答:可以那判断帧头帧尾即可,保证数据不错位就OK啦,
    帧头帧尾是怎么判断的呢
    答:if语句啊
    帧头帧尾是905自己添加的是吗?
    答:不是,这个通信协议是你自己定义的,当然得你来添加了。

    这个吗
    data_to_send[0]=0xAA;
            data_to_send[1]=0xAA;
            data_to_send[2]=0x01;
    while(1) 2015/9/15 20:16:02

    答:其实nrf内部也有通信协议,帧头帧尾,校验,但那时保证数据在空中传输的正确性。   而你自己定义的通信协议主要是为了保证不错位。


    就是再发送真正有用的头和尾发一个字节的用于识别的数据 在接收在检测这两个数据是吧
    答:嗯嗯,但是要能够被区分出来不是真正数据才行。比如帧数据不会出现oxff,那你就可以用oxff作为帧头
    哦 这就是自己定义的通信协议了吧

    我知道答案 目前已有3人回答
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2017-2-9 14:16
  • 签到天数: 17 天

    连续签到: 1 天

    [LV.4]偶尔看看III

    25

    主题

    1785

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2250
    最后登录
    2024-6-11
    发表于 2015-9-16 09:47:17 | 显示全部楼层
    很实用的知识。。。谢谢分享
    freescaleic.org.png
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
     楼主| 发表于 2015-9-16 23:17:51 | 显示全部楼层
    JackieLaura 发表于 2015-9-16 09:47
    很实用的知识。。。谢谢分享

            哈哈,每天都能第一个看见你
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    61

    主题

    965

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    2394
    最后登录
    1970-1-1
    发表于 2015-9-17 11:41:42 | 显示全部楼层
    支持            
    回复 支持 反对

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-21 02:25 , Processed in 0.091382 second(s), 25 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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