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 + -
显示快捷键?