📄 uart_dcmt.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 + -