📄 uart0_rx.c
字号:
void RXRERE();
void uart_set_time();
void uart_read_time();
void uart_addvip();
void uart_addnom();
void uart_delvip();
void uart_delnom();
uchar uart_card();
void uart_card_error();
void uart_read();
void uart_set();
//------------------------------------------------------------------------------
//UART0程序
//------------------------------------------------------------------------------
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
_DINT();
RXRERE();
_EINT();
}
/*******接收程序*************/
void RXRERE()
{
uchar i,j;
uchar rx_pre[7]={0x7e,0x31,0x30,addr1,addr,0x38,0x30};
RX_DATA[0]=U0RXBUF;
if(RX_DATA[0]==0xaa)
{
while (!(IFG1 & URXIFG0));
RX_DATA[1]=U0RXBUF;
if(RX_DATA[1]==0x01)
{
while (!(IFG1 & URXIFG0));
RX_DATA[2]=U0RXBUF;
if(RX_DATA[2]==0x01)
{
i =uart_card();
if(i)
{
FLAG |= gb_addvip;
}
else
{
uart_card_error();
}
}
else if(RX_DATA[2]==0x02)
{
i =uart_card();
if(i)
{
FLAG |= gb_addnom;
}
else
{
uart_card_error();
}
}
}
else if(RX_DATA[1]==0x02)
{
while (!(IFG1 & URXIFG0));
RX_DATA[2]=U0RXBUF;
if(RX_DATA[2]==0x01)
{
i =uart_card();
if(i)
{
FLAG |= gb_delvip;
}
else
{
uart_card_error();
}
}
else if(RX_DATA[2]==0x02)
{
i =uart_card();
if(i)
{
FLAG |= gb_delnom;
}
else
{
uart_card_error();
}
}
}
}
else if(RX_DATA[0]==0x7e)
{
for(i=1;i<7;i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
if(RX_DATA[i] != rx_pre[i])
{
goto end;
}
}
while (!(IFG1 & URXIFG0));
RX_DATA[7]=U0RXBUF;
while (!(IFG1 & URXIFG0));
RX_DATA[8]=U0RXBUF;
i=hex_c(RX_DATA[7]);
j=hex_c(RX_DATA[8]);
j |= i<<4;
switch(j)
{
case 0x49: uart_set(); break;
case 0x4a: uart_read(); break;
}
}
end:
return;
}
/*************************************/
/*********接收设置命令****************/
/*************************************/
uchar uart_set_re(uchar x)
{
uchar i;
uint j;
uchar m;
for(i=17;i<x;i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
}
j =0;
for(i=1;i<(x-5);i++)
{
j +=RX_DATA[i];
}
j %=0xffff;
j ^=0xffff;
j +=1;
m=0;
for(i=(x-5); i<(x-1); i++)
{
m |=hex_c(RX_DATA[i])<<((x-i-2)*4);
}
if(j==m)
{
if(RX_DATA[x-1]==0X0D)
{
for(i=17;i<(x-5);i++)
{
RX_DATA[i] =hex_c(RX_DATA[i]);
}
return 1;
}
}
return 0;
}
/***********接受设置时间命令**********/
void uart_set_time()
{
uchar x;
x = 38;
if(uart_set_re(x))
{
FLAG |=gb_wr1302;
}
}
/*********************************/
/****回复设置历史记录参数*********/
/*********************************/
void set_par_re()
{
set_tx();
TX_DATA[7] =0x30;
TX_DATA[8] =0x30;
TX_DATA[9] =0x30;
TX_DATA[10] =0x30;
TX_DATA[11] =0x30;
TX_DATA[12] =0x30;
TX_DATA[13] =0x46;
TX_DATA[14] =0x44;
TX_DATA[15] =0x42;
TX_DATA[16] =0x36;
TX_DATA[17] =0x0D;
FLAG |= gb_tx;
}
/********************************/
/****接收设置历史纪录参数命令****/
/********************************/
void uart_set_par()
{
uchar x;
x = 32;
if(uart_set_re(x))
{
SAVEP |= RX_DATA[17]<<4;
SAVEP = RX_DATA[18];
SAVEP |= RX_DATA[19]<<12;
SAVEP |= RX_DATA[20]<<8;
LOADP |= RX_DATA[21]<<4;
LOADP = RX_DATA[22];
LOADP |= RX_DATA[23]<<12;
LOADP |= RX_DATA[24]<<8;
MF = RX_DATA[25]<<4;
MF |= RX_DATA[26];
set_par_re();
FLAG1 |= gb_flashw;
}
else
{
x = 28;
if(uart_set_re(x))
{
LOADP |= RX_DATA[17]<<4;
LOADP = RX_DATA[18];
LOADP |= RX_DATA[19]<<12;
LOADP |= RX_DATA[20]<<8;
MF = RX_DATA[21]<<4;
MF |= RX_DATA[22];
set_par_re();
FLAG1 |= gb_flashw;
}
}
}
/********************************/
/********接受设置命令************/
/********************************/
void uart_set()
{
uint i;
uint j;
for(i=9; i<17;i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
}
i=hex_c(RX_DATA[13]);
j=hex_c(RX_DATA[14]);
j |= i<<4;
if(j == 0xf1)
{
i=hex_c(RX_DATA[15]);
j=hex_c(RX_DATA[16]);
j |= i<<4;
switch(j)
{
case 0xe0: uart_set_time(); break;
case 0xf0: uart_set_par(); break;
}
}
}
/*******接收读取时间命令********/
void uart_read_time()
{
uchar rx_pre[7]={0x30,0x30,0x46,0x43,0x33,0x44,0x0d};
uchar i;
for(i=0; i<7; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
if(RX_DATA[i] != rx_pre[i])
{
goto retimeend;
}
}
FLAG |=gb_re1302;
FLAG |=gb_time_re;
retimeend:
return;
}
/****读取卡号数目*********/
void uart_read_cdnum()
{
uchar rx_pre[7]={0x30, 0x30, 0x46, 0x43, 0x33, 0x38, 0x0d };
uchar j;
uint i;
for(i=0; i<7; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
if(RX_DATA[i] != rx_pre[i])
{
goto retimeend;
}
}
set_tx();
TX_DATA[7] = 0x34;
TX_DATA[8] = 0x41;
TX_DATA[9] = 0x30;
TX_DATA[10] = 0x30;
TX_DATA[11] = 0x43;
TX_DATA[12] = 0x30;
TX_DATA[13] = 0x30;
TX_DATA[14] = 0x34;
i = nvip + nnom;
j = (i>>12) & 0x0f;
TX_DATA[15] = c_hex(j);
j = (i>>8) & 0x0f;
TX_DATA[16] = c_hex(j);
j = (i>>4) & 0x0f;
TX_DATA[17] = c_hex(j);
j = i & 0x0f;
TX_DATA[18] = c_hex(j);
i=0;
for(j=1; j<19; j++)
{
i +=TX_DATA[i];
}
i %=0xffff;
i ^=0xffff;
i +=1;
j =(i>>12)&0x0f;
TX_DATA[19]=c_hex(j);
j =(i>>8)&0x0f;
TX_DATA[20]=c_hex(j);
j =(i>>4)&0x0f;
TX_DATA[21]=c_hex(j);
j =i&0x0f;
TX_DATA[22]=c_hex(j);
TX_DATA[23]=0X0D;
tx_len =24;
FLAG |=gb_tx;
retimeend:
return;
}
/*************************/
/***顺序读取一条记录******/
/*************************/
void uart_read_meg()
{
uchar rx_pre[5]={0x46, 0x43, 0x39, 0x42, 0x0D};
uchar i;
for(i=0; i<5; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
if(RX_DATA[i] != rx_pre[i])
{
goto remegend;
}
}
FLAG1 |=gb_remsg;
remegend:
return;
}
/*************************************/
/*********读取历史记录参数************/
/*************************************/
void uart_read_megpar()
{
uchar rx_pre[7]={0x30, 0x30, 0x46, 0x43, 0x33, 0x43, 0x0D};
uchar i;
for(i=0; i<7; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
if(RX_DATA[i] != rx_pre[i])
{
goto megparend;
}
}
FLAG1 |=gb_repar;
megparend:
return;
}
/***接收读取信息命令******/
void uart_read()
{
uint i;
uint j;
for(i=9; i<17;i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
}
i=hex_c(RX_DATA[13]);
j=hex_c(RX_DATA[14]);
j |= i<<4;
if(j == 0xf2)
{
i=hex_c(RX_DATA[15]);
j=hex_c(RX_DATA[16]);
j |= i<<4;
switch(j)
{
case 0xe0: uart_read_time(); break;
case 0xe5: uart_read_cdnum(); break;
case 0xe2: uart_read_meg(); break;
case 0xe1: uart_read_megpar();break;
}
}
}
/***********************/
/****增加正式卡号*******/
/***********************/
uchar uart_card()
{
uint i;
uint j=0;
uint m=0;
for(i=3; i<6; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
}
j |=RX_DATA[3]<<8;
j |=RX_DATA[4]<<4;
j |=RX_DATA[5];
j =j*4+6;
for(i=6; i<j+1; i++)
{
while (!(IFG1 & URXIFG0));
RX_DATA[i]=U0RXBUF;
}
for(i=0; i<j; i++)
{
m +=RX_DATA[i];
}
m &=0xff;
if(m == RX_DATA[j])
{
return 1;
}
else
{
return 0;
}
}
/*****接收卡号错误******/
void uart_card_error()
{
TX_DATA[0] = 0XAA;
TX_DATA[1] = 0X03;
TX_DATA[2] = 0X02;
TX_DATA[3] = 0X00;
TX_DATA[4] = 0X00;
TX_DATA[5] = 0X00;
TX_DATA[6] = 0XAF;
FLAG |=gb_tx;
tx_len =7;
}
/*********发送程序***********/
void uart0_tx()
{
if(FLAG & gb_tx)
{
_DINT();
FLAG &= ~gb_tx;
uchar i ;
P3OUT |=BIT3;
for(i=0;i<tx_len;i++)
{
while (!(IFG1 & UTXIFG0));
U0TXBUF=TX_DATA[i];
}
while(!(TXEPT&UTCTL0));
P3OUT &=~BIT3;
_EINT();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -