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

📄 uart_dcmt.c

📁 arm7 sample code, some demo for arm7 of linux
💻 C
字号:
/****************************************Copyright (c)**************************************************
**                               Guangzhou ZHIYUAN electronics Co.,LTD.
**                                     
**                                 http://www.embedtools.com
**
**--------------File Info-------------------------------------------------------------------------------
** File Name:          Uart_DCMT.c
** Last modified Date: 2006-11-18
** Last Version:       v1.0
** Description:        LM3S单片机下直流电机模块串口通讯协议
** 
**------------------------------------------------------------------------------------------------------
** Created By:         Zhou Shaogang
** Created date:       2006-11-18
** Version:            v1.0
** Descriptions:
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Description:
**
********************************************************************************************************/

#include "config.h"


/************************************************************************************
** Function name: CheckXor
** Descriptions:  异或效验
** Input:         Buffer:异或效验数据存储首地址
**                NByte: 异或效验数据个数
** Output:        8位异或结果
** Created by:    Zhou Shaogang
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
uint8 CheckXor(uint8 *Buffer, uint16 NByte)
{
  uint8 uTemp=0;
    
  while(NByte-- >0)
  {
   uTemp ^=*Buffer++;   		
  }

  return(uTemp);
}


/************************************************************************************
** Function name: Uart_DcMt_Rec
** Descriptions:  直流电机模块串口接收协议
** Input:         SrcQueue     源队列首地址
**                DstArray     目标数组首地址
**                DataLength   接收到的数据长度
**                TimeCnt      超时计数器
**                TimeMax      超时阀值
** Output:        UART_RUN:    运行中
**                UART_OK:     接收到命令
**                UART_TIMEOUT:超时错误
**                UART_HDR_ERR:同步头错误
**                UART_XOR_ERR:异或效验错误 
** Created by:    Zhou Shaogang
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
uint8 Uart_DcMt_Rec(void *SrcQueue, 
                    uint8 *DstArray,
                    uint16 *DataLength, 
                    uint32 *TimeCnt,
                    uint32 TimeMax)
{
  static uint8 Step=0;
  static uint16 Len=0;
  uint8  State;
  uint8 uTemp;
  uint16 i; 
  
  State=UART_RUN;

  if( (Step>0) && ((*TimeCnt)>TimeMax) )
  { QueueFlush(SrcQueue); State=UART_TIMEOUT; Step=0; }
   
  if(Step==0)                                 //等待数据
  {  
    if(QueueNData(SrcQueue)>0)           
    { 
      *TimeCnt=0; 
      Step++; 
    }  
  }

  if(Step==1)                                 //找同步头
  {    
    if(QueueNData(SrcQueue)>1)           
    { 
      QueueRead(&uTemp, SrcQueue);        //读取第一个字节
      if(uTemp==UART_PC_HDR)              //第一个字节是同步头,跳到下一步
        Step++; 
      else
      {
        QueueRead(&uTemp, SrcQueue);      //读取第二个字节
        if(uTemp==UART_PC_HDR)            //第二个字节是同步头,跳到下一步
          Step++; 
        else                              //第二个字节也不是同步头,清空队列,回到第一步
        { QueueFlush(SrcQueue); State=UART_HDR_ERR; Step=0; }  
      }
    }          
   }     
      	
  if(Step==2)                                 //接收帧长
  {
    if(QueueNData(SrcQueue)>=2)      
    { 
       QueueRead(&uTemp, SrcQueue);        //算出帧长   
       Len=uTemp;
       QueueRead(&uTemp, SrcQueue); 
       Len |=(uTemp<<8);
       Step++;                             //下一步  
    }
  }

  if(Step==3)                                 //接收用户数据和校验
  {
    if( QueueNData(SrcQueue)>=(Len-3) ) //数据足够  
    {
       for(i=0; i<(Len-3); i++)            //读出用户数据和校验
       { QueueRead(DstArray+i, SrcQueue); }
                                            //自我校验 
       uTemp= UART_PC_HDR ^ (Len & 0xFF) ^ (Len>>8) ^ CheckXor(DstArray, Len-5); 
       i=(~DstArray[Len-4]) & 0x00FF;
       if( (uTemp!=DstArray[Len-5]) || (uTemp!=i) ) //校验错误
       { State=UART_XOR_ERR; }        
       else                                //校验正确,返回成功
       { *DataLength=Len-5; State=UART_OK; }

       QueueFlush(SrcQueue);               //清空接收队列,回到第0步
      Step=0;
    }
   }    
   
  if(Step>3)
  {  Step=0; }
  
  return(State);
}


/************************************************************************************
** Function name: Uart_DcMt_Send
** Descriptions:  直流电机模块串口发送协议
** Input:         Buffer:      发送数组首地址
**                NByte:       发送字节的个数
** Output:        无
** Created by:    Zhou Shaogang
** Created Date:  2006-11-18
**----------------------------------------------------------------------------------
** Modified by:
** Modified Date: 
**----------------------------------------------------------------------------------
************************************************************************************/
void Uart_DcMt_Send(uint8 *Buffer, uint16 NByte)
{
  uint8 BufGrp[5];

  BufGrp[0]=UART_MCU_HDR;
  BufGrp[1]=(NByte+5) & 0xFF;
  BufGrp[2]=(NByte+5) >> 8;
  BufGrp[3]=CheckXor(BufGrp, 3) ^ CheckXor(Buffer, NByte);  
  BufGrp[4]=~BufGrp[3];

  Uart0Send(BufGrp, 3);
  Uart0Send(Buffer, NByte);                 //发送用户数据
  Uart0Send(BufGrp+3, 2);
} 
 

⌨️ 快捷键说明

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