5533|13

1

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

一个通信协议我怎么还是写不出来 [复制链接]

  
  我上位机给下位机发指令EB 90 EB 90数据头02 要返回字符个数 90 EB 数据尾
  下为机接收到指令进行判断 发回EB 90 EB 90 数据头 02 要发送字符个数 AA BB发送两字节字符 90 EB 数据尾
  我用的51单片机
  单片机里面的判断我怎么也写不好,我刚接触C51不久
  我郁闷了
  来个帮写下,测试好了再发给我
  万分感谢

最新回复

楼主,你先把下位机收到的每个字节逐一打印出来,看看字节顺序,就知道该怎么判断了。  详情 回复 发表于 2010-6-13 21:51
点赞 关注

回复
举报

1

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
朋友,问问题时,连问题的排版、问题的描述都搞不好,我怎么帮你?!
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 alexmayer 的回复:
朋友,问问题时,连问题的排版、问题的描述都搞不好,我怎么帮你?!


我的问题很简单
就是我上位机发送EB 90 EB 90 02 03 90 EB
                数据头               数据           数据尾
下位机怎么判断这几个字符是合格的
 
 
 

回复

10

帖子

0

TA的资源

一粒金砂(初级)

4
 
EB 90 EB 90       02 03         90 EB
数据头             数据              数据尾
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

5
 
"EB 90 EB 90"  "02 03"  "90 EB"
数据头 数据 数据尾
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 
先判断头尾,然后再判断数据就可以了.

 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

7
 
一环接环的检查
 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

8
 
  楼主,怎么一个判断不就是一个if的问题吗,多看点书吧。
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

9
 
我给你提供两个方法,一个是收一个字节判断一次,如果不对,这帧数据直接扔掉
第二个是这帧数据都收进来,然后判断是否正确
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

10
 

  1. switch a
  2. case 1
  3. 判断,如果第一个字节正确,a+1,这样进行第二个字节判断,不对扔掉,a复位,从第一个判断
  4. case 2 类似上个字节
复制代码
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

11
 
大概写一个,具体的LZ你去调试去吧
unsigned char IsFinish = FALSE;//用于确认数据是否接收完成

struct
{
    unsigned char Rbuf[7];//存放接收的指令

    unsigned char PIndex;//位置指针
}RxCommand;//找一个地方初始化PIndex为0

//在接收中断中
unsigned char RxByte = SBUF;

if (FALSE == IsFinish)
{
    switch(RxCommand.PIndex)
    {
        case 0:
        {
            if (RxByte == 0xEB)
            {
                //数据为期望
                RxCommand.Rbuf[RxCommand.PIndex++] = RxByte;
            }
            else
            {
                RxCommand.PIndex = 0;
            }

            break;
        }

        //自己补完剩下的


        case 5:
        {
            //最后一个数据处理
            if (RxByte == 0xEB)
            {
                //数据为期望
                RxCommand.Rbuf[RxCommand.PIndex++] = RxByte;
                IsFinish = TRUE;//接收完成
                RxCommand.PIndex = 0;//复位位置指针
            }
            else
            {
                RxCommand.PIndex = 0;
            }

            break;
        }
    }
}

unsigned char DataLen = 0;
//在主程序中应用的话:
if (TRUE == IsFinish)
{
    DataLen = RxCommand.Rbuf[4];//取出数据长度

    //发送数据头
    Sendchar(0xED);
    //自己处理完剩下的

    //发送长度
    Sendchar(DataLen);

    for (unsigned char i = 0; i < DataLen; i++)
    {
        //把你的数据发出去,我也不知道你的数据在哪
    }

    //把帖尾补上,自己完成了。
   

    IsFinish = FALSE;//重置标志让串口重新接收
}
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

12
 
先判断是否是数据头,比如if(**==Oxeb90eb90)如果不等就退出了
             接下来读数据长度定义一个整形变量比如i;
                            读数据块for(k=i;k>0;k--)
                                {
                                  读数据
                                      }
                         读完后判断后面数据是否是数据尾
                       还是if(**==90eb)这样的应该就可以了
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(中级)

13
 
引用 11 楼 xiaomage_2000 的回复:

先判断是否是数据头,比如if(**==Oxeb90eb90)如果不等就退出了
             接下来读数据长度定义一个整形变量比如i;
                            读数据块for(k=i;k>0;k--)
                                {
                                  读数据
……


UART一次只能传一个字节
 
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

14
 
楼主,你先把下位机收到的每个字节逐一打印出来,看看字节顺序,就知道该怎么判断了。
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表