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

📄 serial.c

📁 查询式单片机的串口通讯源代码
💻 C
字号:
#include "serial.h" 
#include "..\main\port.h"
#include "..\main\ext_reg.h"
#include <intrins.h>

#define NOP() {_nop_(); _nop_();}

void Serial_Init()
{
   // Serial init

   PCON &= 0x7F;   // Set SMOD bit to 0 (don't double baud rates)
   SCON = 0x52;
   TMOD |= 0x20;   // T1 in mode 2, 8-bit auto reload
   TH1 = (256 - (uchar)((((unsigned long)OSC_FREQ / 100) * 3125) 
             / ((unsigned long) BAUD_RATE * OSC_PER_INST * 1000)));
//  TH1 = 0xf4;
   TL1 = TH1;  
   TR1 = 1;  // Run the timer
   TI = 1;   // Send first character (dummy)

   // Interrupt *NOT* enabled
   ES = 0;
   RS485EN = 0;
   
   RS_RecvPrt = 0;        //接收指针
   RS_RecvPrcePrt = 0;    //接收处理指针
   RS_SendPrt = 0;        //发送指针
   RS_SendPrcePrt = 0;    //发送处理指针
//   HiRS_SendPrt = 0;      //发送指针
//   HiRS_SendPrcePrt = 0;  //发送处理指针
   bRS_SendPrce = 0;
}


/*------------------------------------------------------------------*-

  Serial_Update()
 
-*------------------------------------------------------------------*/
void Serial_Update()
{ 
   static uchar idata RecvState = RECID1; //接收状态
   static uchar idata Len;                //数据包长度
   static uchar idata VerSum;             //校验和
   static uchar idata RecvPtr;            //接收数据指针 
   static uchar idata  Recv_Idle_Count=0;

   if(TI == 1)
    {
	  TI = 0;
      if(mTranLen)
       { 
         RS485EN = 1;
         NOP(); 
         SBUF = mTran_Buff[mTranPtr][RS_SendPrcePrt];   
         mTranPtr++;
         if(mTranPtr >= mTranLen)
            { 
               mTranPtr = 0;
               mTranLen = 0;    
            }
       } 
      else
       { 
	     RS485EN = 0;   // 485Recv 
         bRS_SendPrce = 0; 
         if((++RS_SendPrcePrt)>=N_RS_SEND)
           {  RS_SendPrcePrt = 0;  }  
       }
    }
         
   // Only dealing with received bytes here
   // -> Just check the RI flag
  if((Recv_Idle_Count++)>50)
   {
      Recv_Idle_Count = 0;
      RecvState = RECID1;
   }

   if (RI == 1)
      {
        RI = 0;      
 		Recv_Idle_Count = 0;
        switch(RecvState)
          {
            case RECID1:
              if(SBUF == 0xaa)
               {
                 RecvState = RECID2; 
               }
              break;

            case RECID2:
              if(SBUF == 0x83)
               {
                 RecvState = RECLEN; 
               }
              else
               {
                 RecvState = RECID1;
               }
               break;

            case RECLEN:
               Len = SBUF;
               if((Len>=RECVBUFFLEN)||(Len<2))
                {
                  RecvState = RECID1;
				  break;
                }
               VerSum = Len;
			   RecvPtr = 0;
               RecvState = RECBUF;  
               break;

            case RECBUF:	 
               mRecv_Buff[RecvPtr][RS_RecvPrt] = SBUF;  
               RecvPtr++;
               VerSum = VerSum^SBUF;
               if((RecvPtr+1)>=Len)
                {
                  RecvState = RECSUM;
                }
               break;

            case RECSUM: 
               if(VerSum == SBUF)
                {  
                   if((++RS_RecvPrt)>=N_RS_RECV)
                     { RS_RecvPrt = 0; }	    
                } 
                RecvState = RECID1;
                break;

            default:
               RecvState = RECID1;
               break;
           }
      } 
}


/*------------------------------------------------------------------*/
void Serial_Send()
{ 
   uchar i,len; 
 
   if(bRS_SendPrce) return;

   if(RS_GetSendCount()==0) return;

   len = mTran_Buff[2][RS_SendPrcePrt];
   if((len>=TRANBUFFLEN)||(len<2))
   {
      if((++RS_SendPrcePrt)>=N_RS_SEND)
	  { RS_SendPrcePrt = 0; }
	  return;
   } 
       
   mTran_Buff[0][RS_SendPrcePrt] = 0xbb;
   mTran_Buff[1][RS_SendPrcePrt] = 0x83;
   mTran_Buff[2][RS_SendPrcePrt] = len+1; 
   mTran_Buff[len+3][RS_SendPrcePrt] = len+1;  //从长度字开始校验
   for(i=0;i<len;i++)
     {
        mTran_Buff[len+3][RS_SendPrcePrt] ^= mTran_Buff[i+3][RS_SendPrcePrt];
     }
   mTranPtr = 0;
   mTranLen = len+4;  // 0xaa,0x83,len,crc (4Bytes)
   bRS_SendPrce = 1; 

   TI = 1; //重要 
}

//(1)、发送缓冲区中待处理信息信息数
uchar RS_GetSendCount()
{
   if(RS_SendPrt >= RS_SendPrcePrt)
    {  
	   return (RS_SendPrt - RS_SendPrcePrt); 
	}
   else
    { 
	  return (N_RS_SEND + RS_SendPrt - RS_SendPrcePrt + 1); 
	}
}

//(2)、接收缓冲区中待处理信息信息数
uchar RS_GetRecvCount()
{ 
   if(RS_RecvPrt >= RS_RecvPrcePrt)
    { 
	  return (RS_RecvPrt - RS_RecvPrcePrt);  
	}
   else
    { 
	  return (N_RS_RECV + RS_RecvPrt - RS_RecvPrcePrt + 1); 
	}
} 
/*------------------------------------------------------------------*-
  ---- END OF FILE -------------------------------------------------
-*------------------------------------------------------------------*/


⌨️ 快捷键说明

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