⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 chu_kou.c

📁 linux serial example
💻 C
字号:
#include <reg52.h>
#include "Chu_kou.h"

void TOGGLE_WD(void);
void Delay(unsigned char DelayCount);

/************************串口初始化*****************************/
void intermit_initialization(void)
{
   TMOD = 0x21;
   TL1 = TH1 = 0xfc ;
   TR1 = 1 ;
   TH0 = 0x00;
   TL0 = 0x00;
   SCON = 0x70 ;
   PCON = 0x00;
   IE = 0x92 ;
   IP = 0x10 ;
   send_head_ptr = send_end_ptr = &t_buf[0];
   TR0 = 1;
   RI = 0;
   TI = 0;
   have_aa = 0;
   sum = 0;
   reiv_pack = 0;
   //sum_a = 0;
}
/*****************************正应答***********************************/
void ack(void)
{
   TOGGLE_WD() ;
   *send_end_ptr = 0xaa;
   if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
   *send_end_ptr = 0xdd;
   if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
   TI = 1;
  /* SBUF=0xaa;  */
   Delay(255);
   Delay(255);
   Delay(255);
                        Delay(255);
                        Delay(255);

}
/*****************************负应答***********************************/
void no_ack(void)
{
   TOGGLE_WD() ;
   *send_end_ptr = 0xaa;
   if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
   *send_end_ptr = 0xee;
   if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
   TI = 1;
   Delay(255);
   Delay(255);
   Delay(255);
                        Delay(255);
                        Delay(255);
}

intermit() interrupt 4 using 1
{
   if(RI)
   {
      RI = 0;
      if(head_package)
      {
         if(SBUF == 0xaa)
         {
            have_aa = 1;
            head = 1;
            head_package = 0;
            return;
         }
         have_aa = 1;
         r_temp[sum ++] = SBUF;
         if(sum >= SUM_LONG) sum = 0;
         crc = crc ^ SBUF;
         return;
      }
      if(end_package)
      {
         if(SBUF == crc)
         {
            head_package = 0;
            full_package = 1;
            end_package = 0;
            crc = 0;
            ack_code = 1;              //置应答标志位
            //ack();                  //正应答
            return;
         }
         else
         {
            head_package = 0;
            full_package = 1;
            end_package = 0;
            crc = 0;
            ack_code = 0;              //清应答标志位
           // no_ack();               //负应答
            return;
         }
      }
      if(SBUF == 0xaa)
      {
         if(have_aa)
         {
            have_aa = 0;
            head_package = 1;
            r_temp[sum ++] = SBUF;
            if(sum >= SUM_LONG) sum = 0;
            crc = crc ^ 0xaa ^ 0xaa;
            return;
         }
         else
         {
            head = 1;
            return;
         }
      }
      if(head)
      {
         head = 0;
         if(SBUF == 0xbb)
         {
            have_aa = 1;
            head_package = 1;
            crc = crc ^ 0xaa ^ 0xbb;
            package_add_h = sum;
            return;
         }
         if(SBUF == 0xcc)
         {
            have_aa = 0;
            head_package = 0;
            end_package = 1;
            crc = crc ^ 0xaa ^ 0xcc;
            package_add_e = sum;
            return;
         }
         //新加程序
         if(SBUF == 0xdd)
         {
            reiv_pack = 0;
            reiv_pack1=0x00;
            return;
         }
         if(SBUF == 0xee)
         {

          reiv_pack = 0x0f;
          return;
          }
      }
   }
   else if(TI)
   {
      TI = 0;
      if(send_head_ptr != send_end_ptr)
      {
         SBUF = *send_head_ptr ;
         if(++send_head_ptr >= &t_buf[_LONG]) send_head_ptr = & t_buf[0];
      }
   }
}

void tx_buffer( uchar _long)
{
    uchar idata j, _xor;
    TOGGLE_WD() ;
    reiv_pack1=0x01;
    _xor = 0;
    *send_end_ptr = 0xaa;
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    _xor = _xor ^ 0xaa ;
    *send_end_ptr = 0xbb;
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    _xor = _xor ^ 0xbb ;
    *send_end_ptr = r_buf[0];
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    _xor = _xor ^ r_buf[0] ;
  /*  if(_long != 0)
    {
       *send_end_ptr = state;
       if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
       _xor = _xor ^ state ;
    } */

    for ( j = 1 ; j < _long ; j ++ )
    {
       if(t_temp[j] == 0xaa)
       {
          *send_end_ptr = 0xaa ;
          if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
          _xor = _xor ^ 0xaa ;
       }
       *send_end_ptr = t_temp[j] ;
       _xor = _xor ^ t_temp[j] ;
       if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    }
    *send_end_ptr = 0xaa;
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    _xor = _xor ^ 0xaa ;
    *send_end_ptr = 0xcc;
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    _xor = _xor ^ 0xcc ;
    *send_end_ptr = _xor;
    if((++ send_end_ptr) >= &t_buf[_LONG]) send_end_ptr = &t_buf[0];
    reiv_pack = 0;

    TI = 1 ;
}
uchar uncoil_package(void)
{
   uchar idata j;
   uchar idata i;
   TOGGLE_WD();
   i = 0;
   j = 0;
   if(full_package)
   {
      if(ack_code) ack();        //正应答
      if(!ack_code) no_ack();             //负应答
      for(i = package_add_h; i != package_add_e;)
      {
         r_buf[j] = r_temp[i ++];
         if(i >= SUM_LONG) i = 0;
         j ++;
      }
      full_package = 0;
      i = 1;
   }
   return(i);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -