找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2658|回复: 4
收起左侧

单片机+RS485通讯如何准确提取到数据包?

[复制链接]
回帖奖励 5 黑币 回复本帖可获得 5 黑币奖励! 每人限 1 次
ID:323902 发表于 2019-7-11 14:42 | 显示全部楼层 |阅读模式
按一下触摸屏,会发送很多次同样的指令,如何提取到其中一个完整的数据包?现有程序如下,可以实现串口助手和从机单片机的通讯来启停机,但改成触摸屏作主机就不行了:

单片机源程序如下:
#include "stc81.h"
#include "chuankou.h"
#include "string.h"

extern uchar bufferR[20];
extern uchar bufferS[20];
extern uchar wptr;
void carryout()
{
if(bufferR[7]==0x00&&bufferR[8]==0xaa)//设置/动作
{
  
  if(bufferR[9]==0x00&&bufferR[10]==0x00)//启动
  {
    RUN11=0;
    RUN21=0;
    RUN31=0;
    RUN41=0;
   STOP11=0;
   STOP21=0;
   STOP31=0;
   STOP41=0;
   delay(50);
   bufferR[9]=0x10;
   bufferR[10]=0x10;
   wptr=0;
       bufferS[0]=0xaa;
          bufferS[1]=0x10;
       bufferS[2]=0x00;
          bufferS[3]=0x00;
       bufferS[4]=0x00;
          bufferS[5]=0x02;
       bufferS[6]=0x58;
          bufferS[7]=0x13;
   delay(50);
      Uart3SendB(bufferS,8);
            
  }
  if(bufferR[9]==0x00&&bufferR[10]==0x01)
  {
   RUN11=1;
   RUN21=1;
   RUN31=1;
   RUN41=1;
   STOP11=1;
   STOP21=1;
   STOP31=1;
   STOP41=1;
   delay(50);
//   memset(bufferR,1,sizeof(bufferR));
   bufferR[9]=0x10;
   bufferR[10]=0x10;
   wptr=0;
   
   bufferS[0]=0xaa;
          bufferS[1]=0x10;
       bufferS[2]=0x00;
          bufferS[3]=0x00;
       bufferS[4]=0x00;
          bufferS[5]=0x02;
       bufferS[6]=0x58;
          bufferS[7]=0x14;
   delay(50);
      Uart3SendB(bufferS,8);  
  }
}
}
void collectdata()
{
}

void dataprocess()
8{
//CRC校验,符合进入下一步;若不符合,丢掉数据包

if (bufferR[0]==0xaa)//从机地址校验
{
  if (bufferR[2]==0x00&&bufferR[3]==0x00)//数据首地址校验
  {   
   if (bufferR[1]==0x10)//主站下发功能
   {
   
    carryout();
   }
//   else if (bufferR[1]=0x03)//从站上传数据
//   {
//   collectdata();
//   }
  }
}


}
void main()
{
P5M1 = 0;
P5M0 = 0;
Uart3Init();
IE2 = 0x08;      //mabey be set in the T0
EA = 1;          //mabey be set in the T0

while(1)
{
  
  RE485 = 1;
  dataprocess();
  delay(100);
  delay(100);
  delay(100);


回复

使用道具 举报

ID:123289 发表于 2019-7-12 12:16 | 显示全部楼层
连续取至少两帧的长度数据,则里面必有一帧是完整的,处理分析这些数据,从中找到这一个完整的即可。
回复

使用道具 举报

ID:323902 发表于 2019-7-12 18:42 | 显示全部楼层
yzwzfyz 发表于 2019-7-12 12:16
连续取至少两帧的长度数据,则里面必有一帧是完整的,处理分析这些数据,从中找到这一个完整的即可。

具体怎么操作,我写的条件句,好像不行
加一下我好友,谢谢
回复

使用道具 举报

ID:93224 发表于 2019-7-12 21:18 | 显示全部楼层
这个问题在51单片机中有点麻烦,但是我自己设计一种方式接收485的数据很高校,具体的问题你可以联系我,邮箱是bella_mkbz@126.com
回复

使用道具 举报

ID:421308 发表于 2019-7-13 18:25 | 显示全部楼层
代码不对
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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