pcc.c
来自「STC51系列的源码」· C语言 代码 · 共 144 行
C
144 行
/********************************************************************************/
/* filename : PCC.c */
/* created : xillinx */
/* descript : 与计算机通讯的定义和处理 */
/********************************************************************************/
#include "../CPU/CPU.h"
#include "../CFG/CFG.h"
#include "../UART/UART.h"
#include "../PCC/PCC.h"
pcc_hook_function pcc_hook_process=PCC_hook_null;
unsigned char pcc_mdata[0x20];
unsigned char pcc_len;
/********************************************************************************/
/* function : PCC_send_mdata() */
/* created : hw-chen */
/* descript : 通过UART向计算机方式数据 */
/********************************************************************************/
void PCC_hook_null(unsigned char * mdata, unsigned char length)
{ mdata =mdata;
length=length;
}
/********************************************************************************/
/* function : PCC_send_mdata() */
/* created : hw-chen */
/* descript : 通过UART向计算机方式数据 */
/********************************************************************************/
unsigned char PCC_send_mdata(unsigned char type, unsigned char * mdata, unsigned char length)
{ unsigned char i;
ES=0x0;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0xFE;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=type;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
for(i=0x0;i<length;i++)
{ switch(mdata[i])
{
case 0xFF:
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0xFD;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0x2;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
break;
case 0xFE:
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0xFD;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0x1;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
break;
case 0xFD:
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0xFD;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0x0;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
break;
default:
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd)
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=mdata[i];
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
break;
}
}
if(((uart_xmit_wr+0x1)&UART_SEND_BUF_MSK)==uart_xmit_rd) //* 缓冲区已经满了
{ goto out_proc;
}
UART_send_buffer[uart_xmit_wr]=0xFF;
uart_xmit_wr++;
uart_xmit_wr&=UART_SEND_BUF_MSK;
out_proc:
if(uart_xmit_start==0x0) //* 如果需要启动发生,就启动
{ uart_xmit_start=0x1;
TI=1;
ES=0x1;
}
else
{ ES=0x1;
}
return i;
}
/********************************************************************************/
/* function : PCC_recv_mdata() */
/* created : hw-chen */
/* descript : 接收处理计算机发送过来的数据 */
/********************************************************************************/
void PCC_recv_mdata(void)
{ if(uart_recv_start==0x0)
{ return;
}
uart_recv_start=0x0;
pcc_len=0x0;
while(uart_recv_rd!=uart_recv_wr) //* 处理头部,如果第一字节不为0xFE头,丢弃数据,直到找到头部或者数据完毕
{ pcc_mdata[pcc_len++]=UART_recv_buffer[uart_recv_rd++];
}
uart_recv_rd=0x0;
uart_recv_wr=0x0;
pcc_hook_process(&pcc_mdata[0x0],pcc_len);//* 调用HOOK函数
return;
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?