?? bao.c.bak
字號:
#include "bao.h"
#include "xieyi.h"
#include "df_uart.h"
#include "pwm_timer_b.h"
unsigned char aRxBuff[N_XY_BAO]; //接收數(shù)據(jù)緩沖區(qū)
unsigned char NRxBuff=0;
unsigned char aTxBuff[N_XY_BAO]; //發(fā)送數(shù)據(jù)緩沖區(qū)
unsigned char NTxBuff=0;
unsigned char bWaitRe=0; //1:發(fā)送數(shù)據(jù)包后等待PC返回對數(shù)據(jù)包的校驗結(jié)果 0:不等待
unsigned char Command=NONE_COMMAND; //收到的指令
unsigned char SendByte=0; //準(zhǔn)備發(fā)送的字節(jié)數(shù)
unsigned char bUartRxErr=0; //1:接收數(shù)據(jù)出錯,如楨錯、奇偶校驗錯等。0:沒錯
/*****************************************************************************
數(shù)據(jù)包校驗
采用算術(shù)和的方法進(jìn)行
pbuffer:指向要校驗的數(shù)據(jù)緩沖區(qū)的指針
n_byte:校驗的字節(jié)數(shù)
pjiao_zhi:計算出的校驗值
返回值:校驗通過為1,校驗失敗為0
******************************************************************************/
unsigned char JiaoYan(unsigned char *pbuffer,unsigned char n_byte,unsigned char *pjiao_zhi)
{
unsigned char q0,q1=0;
for(q0=0;q0<n_byte-1;q0++)
{
q1 += *pbuffer;
pbuffer++;
}
*pjiao_zhi=q1;
if(q1== *pbuffer)
return 1;
else
return 0;
}
/*****************************************************************************
向緩沖區(qū)中增加一個數(shù)據(jù)
******************************************************************************/
void AddUsData(unsigned char sq0)
{
if(NRxBuff<N_XY_BAO)
{
aRxBuff[NRxBuff]=sq0;
NRxBuff++;
}
}
/*****************************************************************************
處理Uart數(shù)據(jù)包
p0: 用來返回發(fā)送的數(shù)據(jù)的字節(jié)數(shù)
返回值:指向發(fā)送緩沖區(qū)的指針
******************************************************************************/
unsigned char* DoUart(unsigned char *p0)
{
unsigned char q0;
unsigned int iq0;
//判斷接收數(shù)據(jù)
if(NRxBuff!=0)
{
if(aRxBuff[0]==HAND_OK&&bWaitRe==1&&bUartRxErr==0)
{
//發(fā)送完數(shù)據(jù)包,等待PC校驗結(jié)果
bWaitRe=0;
NRxBuff=0;
SendByte=0;
}
else if(aRxBuff[0]==HAND_ERR&&bWaitRe==1&&bUartRxErr==0)
{
//發(fā)送完數(shù)據(jù)包,等待PC校驗結(jié)果
SendByte=N_XY_BAO;
NRxBuff=0;
}
else if(aRxBuff[0]==HAND_BAO&&bWaitRe==0&&bUartRxErr==0)
{
if(NRxBuff==N_XY_BAO)
{
//數(shù)據(jù)包接收完畢
if(JiaoYan(aRxBuff,N_XY_BAO,&q0)==1)
{
//數(shù)據(jù)校驗通過
Command=aRxBuff[1];
}
else
{
//數(shù)據(jù)校驗錯誤
aTxBuff[0]=HAND_ERR;
SendByte=1;
}
NRxBuff=0;
}
}
else
{
//aRxBuff[0]不是合法的值或者數(shù)據(jù)接收錯誤
aTxBuff[0]=HAND_ERR;
SendByte=1;
NRxBuff=0;
bUartRxErr=0;
}
}
//處理指令
iq0=DoCommand(Command);
if(Command!=NONE_COMMAND)
{
aTxBuff[0]=HAND_BAO;
aTxBuff[2]=iq0>>8;
aTxBuff[3]=iq0&0xFF;
JiaoYan(aTxBuff,N_XY_BAO,&aTxBuff[4]);
SendByte=N_XY_BAO;
Command=NONE_COMMAND;
}
if(SendByte==N_XY_BAO)
bWaitRe=1;
*p0=SendByte;
return aTxBuff;
}
/****************************************************************************
其它模塊檢測到數(shù)據(jù)包有錯時通知本模塊數(shù)據(jù)通訊有錯
****************************************************************************/
void SetBaoErr()
{
bUartRxErr=1;
}
/****************************************************************************
執(zhí)行指令
****************************************************************************/
unsigned int DoCommand(unsigned char comd)
{
unsigned int iq0;
switch(comd)
{
case STOP_COMMAND:
//執(zhí)行STOP_COMMAND指令
return (GoPwm(0));
case GO_COMMAND:
//執(zhí)行GO_COMMAND指令
return (GoPwm(100));
case FRE_COMMAND:
//執(zhí)行FRE_COMMAND指令
iq0=(aRxBuff[2]<<8)+aRxBuff[3];
SetFre(iq0);
return iq0;
case SC_COMMAND:
//執(zhí)行SC_COMMAND指令
iq0=(aRxBuff[2]<<8)+aRxBuff[3];
SetScale(iq0);
return iq0;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -