4259|9

62

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

协议让我头痛 [复制链接]

我是一个新手
刚开始学单片机
我想让上位机跟下位机协议通信
上位机我用的C#,这个知道怎么写
但下位机不知道怎么判断数据帧了
协议基本格式是这样的
上位机发送 EB 90 EB 90 04 90 EB
                  起始码    接收字符个数  结束码
下位机 EB 90 EB 90 04  55 AA 55 AA90 EB
              起始码    接收字符个数 4哥字节数据   结束码
我用的51单片机
用C语言实现
来哥大侠帮谢谢代码啊
小弟感激不尽

最新回复

while(1)     {      //串口接收判断       if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE))       {         //接收到1个char         acTempChar = 0;         acTempChar = (USART_ReceiveData(USART2) & 0xFF);//接收程序         acRecBuffer[aiNumber++] = acTempChar;                         //当接收的数据个数超过协议的个数的时候,抛弃重新接收         if(aiNumber > CMD_SIZE ) //此处的CMD_SIZE相当于你开头的 EB 90 EB 90 4个字节         {           aiNumber = 0;           memset(acRecBuffer, 0, CMD_SIZE);           continue;         }                  //检测,保留完整的协议数据         if((SYNC_CHARACTER == acRecBuffer[aiNumber - 1]) && (8!= aiNumber))         {           auNumOfSyncChar++;         }         else         {           //当本次接收的同步数据少于3个的时候,数据错误           //重新接收           //此处就是判断接收的数据和协议是否一样,不一样就抛弃,我这里的同步数据是3个0xaa           if(auNumOfSyncChar < 3)           {             aiNumber = 0;             memset(acRecBuffer, 0, CMD_SIZE);             auNumOfSyncChar = 0;             continue;           }           if(CMD_SIZE == aiNumber)           {             aiNumber = 0;             auNumOfSyncChar = 0;             giIdentify = ID_GPS_COM_PROT;           }         }                    switch(giIdentify)          {             //协议处理函数           case ID_GPS_COM_PROT: //这里替换为你的数据处理函数             DB_gbMainDataProcessFunction(*((ComProStr*)acRecBuffer));             aiNumber = 0;             memset(acRecBuffer, 0, CMD_SIZE);             giIdentify = 0;             break;           default:             break;          }       }           } 这是我的一个程序的下位机接收上位机协议并处理的函数,你改改就能适合你所说的情况了,关键是流程你看懂就ok了,另外你应该加个末尾判断的,不过和协议头判断的差不多。            详情 回复 发表于 2010-6-8 16:23
点赞 关注

回复
举报

77

帖子

0

TA的资源

一粒金砂(中级)

沙发
 
这也太。。。。那啥了吧。

这个数据帧的判断你一个字节一个字节的对比就是了,注意一下字节顺序,真是没任何技术含量。

最多加个重发机制。
 
 

回复

80

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
引用 1 楼 leo_dengzx 的回复:
这也太。。。。那啥了吧。

这个数据帧的判断你一个字节一个字节的对比就是了,注意一下字节顺序,真是没任何技术含量。

最多加个重发机制。

我就不晓得咋写
你要是写出来能出结果分全给你
 
 
 

回复

67

帖子

0

TA的资源

一粒金砂(初级)

4
 
放在一个数据区,一个字节一个字节发就是啦!
 
 
 

回复

75

帖子

0

TA的资源

一粒金砂(初级)

5
 
引用 3 楼 daifeijin 的回复:
放在一个数据区,一个字节一个字节发就是啦!

大哥些我就是对C51代码还不熟
要不我郁闷啥呢
就帮写写吧
在线等
 
 
 

回复

77

帖子

0

TA的资源

一粒金砂(初级)

6
 
上位机发送 EB 90 EB 90 04 90 EB
  起始码 接收字符个数 结束码

这个没清楚。

另外,EB 90是只有两组还是任意组?
结束码是反过来的,有点杯具,另外,串口数字是字节传送,能不能用单字节的起始码?这样好处理些
 
 
 

回复

70

帖子

0

TA的资源

一粒金砂(初级)

7
 
大脑是怎么理解的,程序就应该怎么写。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 6 楼 jennyvenus 的回复:
大脑是怎么理解的,程序就应该怎么写。

不理解不知道怎么写
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

9
 
BUF[] = “0123456789”;
INT8U COUNT = 0;
TI = 1;

ISR()
{
    if(COUNT == 10)停止
    ELSE SBUF = BUF[COUNT ++];
}
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

10
 
while(1)
    {
     //串口接收判断
      if(USART_GetFlagStatus(USART2, USART_FLAG_RXNE))
      {
        //接收到1个char
        acTempChar = 0;
        acTempChar = (USART_ReceiveData(USART2) & 0xFF);//接收程序

        acRecBuffer[aiNumber++] = acTempChar;
               
        //当接收的数据个数超过协议的个数的时候,抛弃重新接收
        if(aiNumber > CMD_SIZE ) //此处的CMD_SIZE相当于你开头的 EB 90 EB 90 4个字节
        {
          aiNumber = 0;
          memset(acRecBuffer, 0, CMD_SIZE);
          continue;
        }
        
        //检测,保留完整的协议数据
        if((SYNC_CHARACTER == acRecBuffer[aiNumber - 1]) && (8!= aiNumber))
        {
          auNumOfSyncChar++;
        }
        else
        {
          //当本次接收的同步数据少于3个的时候,数据错误
          //重新接收
          //此处就是判断接收的数据和协议是否一样,不一样就抛弃,我这里的同步数据是3个0xaa
          if(auNumOfSyncChar < 3)
          {
            aiNumber = 0;
            memset(acRecBuffer, 0, CMD_SIZE);
            auNumOfSyncChar = 0;
            continue;
          }
          if(CMD_SIZE == aiNumber)
          {
            aiNumber = 0;
            auNumOfSyncChar = 0;
            giIdentify = ID_GPS_COM_PROT;
          }
        }
         
         switch(giIdentify)
         {
            //协议处理函数
          case ID_GPS_COM_PROT:
//这里替换为你的数据处理函数
            DB_gbMainDataProcessFunction(*((ComProStr*)acRecBuffer));
            aiNumber = 0;
            memset(acRecBuffer, 0, CMD_SIZE);
            giIdentify = 0;
            break;
          default:
            break;
         }
      }      
    }

这是我的一个程序的下位机接收上位机协议并处理的函数,你改改就能适合你所说的情况了,关键是流程你看懂就ok了,另外你应该加个末尾判断的,不过和协议头判断的差不多。         
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

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

 
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
快速回复 返回顶部 返回列表