简易串口通信协议代码sep4020

来源:互联网 发布:java语言程序设计 编辑:程序博客网 时间:2024/05/06 23:27

周末两天时间把手头项目的简单RS232通信协议实现了。

协议主要有报头、数据长度、数据内容、校验和构成。

程序每收到一帧数据,响应一次中断。用了一个长度50的数组作为uart循环接收。

虽然没什么难度,还是很开心~~~ 拿出来晒一晒,如果能对读者有帮助就更开心了。

欢迎指正。

void RdaIsrUart2(void) //用来实现读取接收FIFO中的数据 并进行处理

{
  //U8 rec_temp;   
  U8 i=0;  U8 j=0;   U8 sum;
  U32 message_Flag=0;
  U8 distance;
  Uart2_rev_buff[Write]=(U8)*(RP)(UART2_RXFIFO);//数据接收并存入Uart2_rev_buff
  
  //TxData(&Write,1); 验证成功
  //TxData(Uart2_rev_buff+Write,1);验证成功
  if(Read==Write)//此时无需判断 直接write++ 等待下一个数据
  {Write++;return;}
  
  next:message_Flag=CheckMessageHead(Read);//报头判断结束  
    distance=CheckDistance(Read,Write);//计算read write距离结束
 
  if(message_Flag==1)
  {
  //TxData(WHERE,1);///////////
  message_Flag=0;
  if(distance>=(Uart2_rev_buff[Read+1]+2))//判断长度是否够长 此时read在报头 write在新值
  {
  j=Read; //下一段为求和
  sum=0;  //不知为何清零很重要,没有默认为0
  for(i=0;i<distance;i++)
  {
  sum=sum+Uart2_rev_buff[j];
  j++;
  if(j>49){j=0;}
  }
  //TxData(&sum,1);  //已经见证成功
  if(sum==Uart2_rev_buff[Write])//判断校验和
  {
  TxData(Right,3);
  Read=Read+distance;//Read移到报文结束下一个数据此时有可能read=write-1  
  if(Read>49) Read=Read-50;
  TxData(&Read,1);
TxData(&Write,1);
  }
  else
  {
  TxData(Wrong,3);
  Read=Read+distance;//Read移到报文结束下一个数据此时有可能read=write-
  if(Read>49) Read=Read-50;
  TxData(Read,1);
  TxData(Write,1);
  }
 
  }
  else//长度不够  此时Read不变 Write++
  {
  Write++;
  if(Write>49)
  Write=0;
  //TxData(Incomplete,4);验证成功
  return;//返回------------------------------直接返回等待下一数据输入
  }
  }//是报头校验情况结束
  
  //开始再去追报文头
  distance=CheckDistance(Read,Write);//再次计算Read Write距离
  if(distance>1) //需要追报头
  {
  if(Read>Write)//write指针走下一圈
  {
  while((message_Flag==0)&&(Read<50))
  {
  message_Flag=CheckMessageHead(Read);
  Read++;
  }
 
  if(Read==50) Read=0;  //此时有没有可能read=write????
  if(message_Flag==1)
  {
  Read--;
  goto next;
  }
  else
  {
  goto next;
  }
  }
  else
  {
  while((message_Flag==0)&&(Read<Write-1))//bimian 0c 00 这样的报文出错不必追到相等
  {
  Read++;
  message_Flag=CheckMessageHead(Read);
  }//结束时Read和Write可能相等
  if(message_Flag==1)
  {
  goto next;
  }
  else
  {
  Write++;
  if(Write>49) Write=0;
  return;
  }
  }
  }
  else//此时distance小于=1 不需要追报头
  {
  Write++;
  if(Write>49) Write=0;
  return;
  }


}
0 0