⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 freescale

📁 Freescale 系列单片机常用模块与综合系统设计
💻
字号:
#include "Recv_Tran.h"
#include "Uart.h"


#define RECFRMMAXLEN   0x10    //接收帧的最大长度,超过此值认为帧超长错误
#define STATUSMAXLEN   0x0A    //设备状态信息最大长度

unsigned char DevNo;         //设备号
unsigned char StatusBuf[STATUSMAXLEN]; //设备状态信息缓冲区

//接收数据帧函数,实际上接收的是主机的指令
uchar Recv_Data(uchar *type) 
{
  uchar tmp,rCount,i;
  uchar r_buf[RECFRMMAXLEN];  //保存接收到的帧
  uchar Flag_ReceOver;        //一帧接收结束标志
  uchar Flag_StartRec;        //一帧开始接收标志
  uchar CheckSum;             //校验和
  uchar DataLen;              //数据字节长度变量
  
  Uart_Ctrl_ClrVal();        //禁止发送,允许接收
  
  //接收一帧数据
  rCount = 0;
  Flag_StartRec = 0;
  Flag_ReceOver = 0;
  
  while(!Flag_ReceOver) 
  {
    Uart_RecvChar(&tmp);
    
    if((!Flag_StartRec) && (tmp == 0x24)) //判断是否接收到字符“$”
    {
       Flag_StartRec = 1;
    }
    
    if(Flag_StartRec) 
    {
      r_buf[rCount] = tmp;
      rCount++;
      
      if(tmp == 0x2A)                   //判断是否接收到字符“*”
      {
         Flag_ReceOver = 1;
      } 
    }
    
    if(rCount == RECFRMMAXLEN)           //帧超长错误,返回0
    {
       return 0; 
    }
  }
  
  CheckSum = 0;                         //计算校验和字节            
  DataLen = r_buf[3];
  
  for(i=0; i++; i<3+DataLen) 
  {
    CheckSum +=r_buf[i+1];  
  }
  
  if(rCount < 6)                      //帧过短错误,返回0,最短的指令帧为6个字节
    return 0;
  
  if(r_buf[1] = DevNo)                //地址不符合错误,返回0
    return 0;
  
  if(r_buf[rCount -2] != CheckSum)    //校验错误,返回0
    return 0;
  
  *type = r_buf[2];                  //获取指令类型
  
  return 1;                          //成功,返回1  
}

//发送数据函数,包括发送指令和发送设备状态信息
void Send_Data(uchar type, uchar len, uchar *buf) 
{
  uchar i,tmp;
  uchar CheckSum = 0;
  
  Uart_Ctrl_SetVal();               //允许发送,禁止接收
  
  tmp = 0x24;
  Uart_SendChar(tmp);               //发送帧起始字节
  
  Uart_SendChar(DevNo);             //发送地址字节,也即设备号
  CheckSum +=DevNo;
  
  Uart_SendChar(type);              //发送类型字节
  CheckSum +=type;
  
  Uart_SendChar(len);               //发送数据长度字节
  CheckSum +=len;
  
  for(i=0; i<len; i++)              //发送数据
  {
    Uart_SendChar(*buf); 
    CheckSum +=*buf;  
    *buf++;  
  }
  
  Uart_SendChar(CheckSum);   
  
  tmp = 0x2A;
  Uart_SendChar(tmp);               //发送帧结束字节   
}














⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -