📄 uart.c
字号:
#define EXT_UART_GLOBALS
#include "includes.h"
/************************************************************
Function Name: T2Init
Function: Timer0 initial
Paramenter: None
Return value: None
Author: Chen yuan zhen May.30.2008
*************************************************************/
void UARTClose(void)
{
UCSRB = 0x00; /*允许接收和发送*/
}
/************************************************************
Function Name: T2Init
Function: Timer0 initial
Paramenter: None
Return value: None
Author: Chen yuan zhen May.30.2008
*************************************************************/
void UARTInitial(void)
{
UCSRA = 0x02; /*倍速*/
UCSRB = 0x98; /*允许接收和发送*/
UCSRC = 0x06; /*8位数据,1位停止位*/
UBRR = 103; /*9600*/
}
/************************************************************
Function Name: SIGNAL(USART_RX_vect)
Function: 在中断中接收host传来的数据
Paramenter: None
Return value: None
Author: Chen yuan zhen Mar.04.2008
*************************************************************/
SIGNAL(USART0_RX_vect)
{
static unsigned char RxCounter=0;
unsigned char RxStatus , data ,checksum=0;
RxStatus = UCSRA;
data =UDR;
if(IS_UART_REC_READY)
{
if( ( RxStatus & ERROR_UART )==0) //如果没有帧错误和溢出错误
{
if(IS_DOWN_LOAD_ENABLE) //下载 ^^%^
{ //可以从这里区分最后的信息
SET_DL_CONTINUE_FLAG;
switch(RxCounter)
{
case 0:
{
if(data==0xFF)
{
RxCounter++;
break;
}
else if(data==0x11)
{
DL_OVER_FLAG=1;
RxCounter++;
break;
}
else //出错
{
RxCounter=0;
UART_ERROR_FLAG=1;
break;
}
}
case 1:
{
/***************1111****************/
if(DL_OVER_FLAG)
{
Interval=data;
RxCounter++;
break;
}
/***************2222****************/
else
{
LStartTime=data;
RxCounter++;
break;
}
}
case 2:
{
/***************1111****************/
if(DL_OVER_FLAG)
{
if((Interval+data)==255)
{
RxCounter++;
break;
}
else //出错
{
RxCounter=0;
UART_ERROR_FLAG=1;
break;
}
}
/***************2222****************/
else
{
HStartTime=data;
RxCounter++;
break;
}
}
case 3:
{
/***************1111****************/
if(DL_OVER_FLAG)
{
if(data==0x02)
{
DL_REALY_OVER=1;
SET_UART_DADA_DISPOSE;
BigStepNum[ModeBuffer] = ((unsigned int)(BigStepBuffer0))*256 +BigStepBuffer1;//记录步长
RxCounter=0;
break;
}
else
{
RxCounter=0;
UART_ERROR_FLAG=1;
break;
}
}
/***************2222****************/
else if((data==0)||(data>10)) //出错
{
RxCounter=0;
UART_ERROR_FLAG=1;
break;
}
else
{
ModeBuffer=data-1; //从0开始计数
RxCounter++;
break;
}
}
case 4:
{
RxCounter++;
BigStepBuffer1=data;
break;
}
case 5:
{
RxCounter++;
BigStepBuffer0=data;
break;
}
case 6:case 7:case 8:case 9:case 10:case 11:
case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:case 21:
case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:case 31:
case 32:case 33:case 34:case 35:case 36:case 37:
{
StepData[RxCounter-6]=data;
RxCounter++;
break;
}
case 38:
{
RxCounter=0;
checksum=ModeBuffer+BigStepBuffer0+BigStepBuffer1+ LStartTime+ HStartTime+1;
for(unsigned char LcvCounter=0;LcvCounter<32;LcvCounter++)
{
checksum+=StepData[LcvCounter];
}
if(checksum!=data)
{
UART_ERROR_FLAG=1;
}
else
{
//AckToPc();
SET_UART_DADA_DISPOSE;
}
break;
}
}
}
//实时处理
if(IS_DOWN_LOAD_DISABLE)
{
REAL_TIME_FLAG=1;
switch(RxCounter)
{
case 0:
{
RUN_FLAG=0; //不知有无必要?
if(data==0xFF)
{
RUN_FLAG=0; //实时控制时关闭跑
RxCounter++;
break;
}
else
{
RxCounter=0;
NackToPc( );
break;
}
}
case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:
case 11:case 12:case 13:case 14:case 15:case 16:case 17:case 18:case 19:case 20:
case 21:case 22:case 23:case 24:case 25:case 26:case 27:case 28:case 29:case 30:
case 31:case 32:
{
StepData[RxCounter-1]=data;
RxCounter++;
break;
}
case 33:
{
for(unsigned char LcvCounter=0;LcvCounter<32;LcvCounter++)
{
checksum+=StepData[LcvCounter];
}
if(checksum==data)
{
AckToPc();
RxCounter=0;
FinalDispose();
}
else
{
RxCounter=0;
NackToPc( );
break;
}
}
}
}
}
else
{
RxCounter=0;
UART_ERROR_FLAG=1;
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -