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

📄 serial.c

📁 一种操作系统源码核
💻 C
字号:
#include <intrins.h>
#include "Page1.h"
#define SERIALREVBUFSIZE 0x3000  
#define SERIALSENDBUFSIZE 0x2000  
#define SERIAL_SRAM_INDEX	0x06
#define MAX_RECV_LEN			48
 BOOLEAN bSerialMode;
 XCHAR  Serial_Baud;
static XCHAR Serial_Bits;
static XCHAR Serial_Stops;
 XCHAR Serial_Parity;
static BOOLEAN  Use_HandShaking;
 XCHAR SERIAL_SERVER_PORT_HIGH;
 XCHAR SERIAL_SERVER_PORT_LOW;
 XCHAR Remote_SERVER_PORT_HIGH;
 XCHAR  Remote_SERVER_PORT_LOW;
// Tcp connection data
static XCHAR _pTcbData[TCB_LENGTH];
static PXCHAR  _pSerialSendbuf;  //serial send buffer
static PXCHAR _pSerialRevbuf;  //Serial receive buffer
static XCHAR  _SerialTcpInPostion;  //serial next receive TcpPacket  postion
 XCHAR  _SerialTcpOutPostion;  //serial next send TcpPacket store postion
static XCHAR  _SerialPortOutPosition;  //serial port out postion
 XCHAR _SerialPortInPosition; //serial port in postion
static XCHAR _iCurMsgPos;
static XCHAR _pRecvPacket[MAX_RECV_LEN];
static DCHAR _iRecvLen;
static XLONG _iReceiveCur;
static BOOLEAN _bDataAcked;
void   PrepareSerialData()
{
 DLONG iSendLength;
 if (_SerialPortInPosition>_SerialTcpOutPostion)
 {
   iSendLength=_SerialPortInPosition-_SerialTcpOutPostion;
   if (iSendLength>197)
	{
	 p_memcpy_x2x(pTcpSendPacket,_pSerialSendbuf+_SerialTcpOutPostion,197);
    _SerialTcpOutPostion+=197;
	 _iCurMsgPos=197;
	 }
	 else
  	{
	 p_memcpy_x2x(pTcpSendPacket,_pSerialSendbuf+_SerialTcpOutPostion,iSendLength);
    _SerialTcpOutPostion=_SerialPortInPosition;
	 _iCurMsgPos=iSendLength;
	 }
  }
  else
  {
     iSendLength=SERIALSENDBUFSIZE+_SerialPortInPosition-_SerialTcpOutPostion;
    if (iSendLength>197)
	{
   	iSendLength=SERIALSENDBUFSIZE-_SerialTcpOutPostion;
	   if   (iSendLength>=197)
      {
      	 p_memcpy_x2x(pTcpSendPacket,_pSerialSendbuf+_SerialTcpOutPostion,197);
	     _SerialTcpOutPostion+=197;
	   }
     else
	  {
	      p_memcpy_x2x(pTcpSendPacket,_pSerialSendbuf+_SerialTcpOutPostion,iSendLength);
         p_memcpy_x2x(pTcpSendPacket+iSendLength,_pSerialSendbuf,197-iSendLength);
         _SerialTcpOutPostion=197-iSendLength;
      } 
   	 _iCurMsgPos=197;
   }
   else//(iSendLength<197 and _SerialPortInPosition<_SerialTcpOutPostion)
  	{
    	iSendLength=SERIALSENDBUFSIZE-_SerialTcpOutPostion;
   	 p_memcpy_x2x(pTcpSendPacket,_pSerialSendbuf+_SerialTcpOutPostion,iSendLength);
	    p_memcpy_x2x(pTcpSendPacket+iSendLength,_pSerialSendbuf,_SerialPortInPosition);
       _SerialTcpOutPostion=_SerialPortInPosition;
	 _iCurMsgPos=iSendLength;
	 }
  }
}
void SaveSerialBuff()
{
      DLONG  iFreeLength;
      iFreeLength=SERIALREVBUFSIZE-_SerialTcpInPostion;
      if   (iFreeLength>Adapter_iReceiveLen)
      {
           p_memcpy_x2x(_pSerialRevbuf+_SerialTcpInPostion,_pRecvPacket,Adapter_iReceiveLen);
          _SerialTcpInPostion+=Adapter_iReceiveLen;
           
       }
       else
       {
             p_memcpy_x2x(_pSerialRevbuf+_SerialTcpInPostion,_pRecvPacket,iFreeLength);
             p_memcpy_x2x(_pSerialRevbuf,_pRecvPacket+iFreeLength,Adapter_iReceiveLen-iFreeLength);
             _SerialTcpInPostion=Adapter_iReceiveLen-iFreeLength;
           
       }
}

void _RunSerial()
{
	DCHAR iIndex;
	PXCHAR pData;
   DLONG  iFreeLength;
 	if (Adapter_iReceiveLen == 0)
 	return;
    pData=Adapter_pReceiveTcpData;//point receive tcp packet 
	iIndex = 0;
	while (iIndex < Adapter_iReceiveLen)
	{
				_pRecvPacket[_iRecvLen] = pData[iIndex]; //receive packet to pRecvPacket
				_iRecvLen ++;
   		    	iIndex ++;
	}
	_iRecvLen = 0;
   if (_SerialPortOutPosition==_SerialTcpInPostion)//first send
	{
      SBUF=_pRecvPacket[0];
      _SerialPortOutPosition++;
 	   _SerialTcpInPostion++;  
   }
	if (_SerialPortOutPosition<=_SerialTcpInPostion)
   {
       iFreeLength=SERIALREVBUFSIZE-_SerialTcpInPostion+_SerialPortOutPosition;
	   if   (iFreeLength>Adapter_iReceiveLen)
      {
         SaveSerialBuff();
         return;
	   }
       //free memory too small
        while((SERIALREVBUFSIZE-_SerialTcpInPostion+_SerialPortOutPosition)<=Adapter_iReceiveLen)
           ;       //wait 
         SaveSerialBuff();
         return;
         
    } 
    else  // if (_SerialPortOutPosition>_SerialTcpInPostion)
    { 
          iFreeLength=_SerialPortOutPosition-_SerialTcpInPostion;
          if (iFreeLength>Adapter_iReceiveLen)
          {
            p_memcpy_x2x(_pSerialRevbuf+_SerialTcpInPostion,_pRecvPacket,Adapter_iReceiveLen);
           _SerialTcpInPostion+=Adapter_iReceiveLen;
           return;
          }
           while (1) //wait 
           { 
                if(_SerialPortOutPosition-_SerialTcpInPostion>Adapter_iReceiveLen)
                  break;      
                  
                if((_SerialPortOutPosition<_SerialTcpInPostion)&&(SERIALREVBUFSIZE-_SerialTcpInPostion+_SerialPortOutPosition>Adapter_iReceiveLen))
                   break;   
           }
           if (_SerialPortOutPosition>_SerialTcpInPostion)
           {
                  p_memcpy_x2x(_pSerialRevbuf+_SerialTcpInPostion,_pRecvPacket,Adapter_iReceiveLen);
                  _SerialTcpInPostion+=Adapter_iReceiveLen;
                   return;
           }
          else //   if (_SerialPortOutPosition<_SerialTcpInPostion)
          {
             SaveSerialBuff();
              return;    
           
  
           } 
     } 
 

}
void  ChangeSerialConfig()
{
  TR2=0;
  ES=0;

 if (!Serial_Parity)
 
   SCON1=0x70; //mode 1 length=10  ren=1
 else 
   SCON1=0xf0; //mode 3 length=11   ren=1
 switch (Serial_Baud)//fosc=16
 {          // 37500 19200

    case 0: //1200 e1199 
     RCAP2L=0x5f;
     RCAP2H=0xfe;
     break;
    case 1://2400  2403
     RCAP2L=0x30;
     RCAP2H=0xff;
     break;
    case 2://4800  e4807.69
     RCAP2L=0x98;
     RCAP2H=0xff;
     break;
    case 3://9600 e9615
     RCAP2L=0xcc;
     RCAP2H=0xff;
     break;
    case 4://19200   e192307
     RCAP2L=0xe6;
     RCAP2H=0xff;      ///65536-(fosc/32* baud rate)   //turbo 
     break;
   
    
   

 }    
 
 T2CON=0X34;  //TIMER2 as band generator  and start run
  ES=1;
}

void SerialInitialize()
{
	// Tcp init
	 _pSerialSendbuf=0x3000;    //serial tcp send  //8k
   _pSerialRevbuf=0x5000;     //serial tcp receive  //12k
     SERIAL_SERVER_PORT_HIGH=0x12;
     SERIAL_SERVER_PORT_LOW= 0x34;
	_bDataAcked = TcbInit(_pTcbData, SERIAL_SERVER_PORT_HIGH,SERIAL_SERVER_PORT_LOW);
      Serial_Baud=3;
      Serial_Parity=0;  //mode1
      ChangeSerialConfig();
	// protocol init
	_iCurMsgPos = 0;
	_iReceiveCur = 0;
    _SerialTcpOutPostion=0;
    _SerialTcpInPostion=0;
	 _SerialPortOutPosition=0;
 	 _SerialPortInPosition=0; 
	// buffers init
  
}

void SerialStart()
{
	SramRead(pTcpSendPacket,SERIAL_SRAM_INDEX,1,0);
	TcpOpen(_pTcbData,Remote_SERVER_PORT_HIGH,Remote_SERVER_PORT_LOW);
	TcpPrepareData();
	_bDataAcked = TcpSend(0);
	SramWrite(pTcpSendPacket,SERIAL_SRAM_INDEX);

}

void SerialHandleTimer()
{
	if (_bDataAcked)	return;

	SramRead(pTcpSendPacket,SERIAL_SRAM_INDEX,1,0);
	if (TcbHandleTimer(_pTcbData)) //超时重发
	{
		return;
	}

	// Handle time out failure
	DebugString("Serial timer failure restart");
	// do error handle here
}

BOOLEAN SerialRun()
{
	if (!TcbCheckData(_pTcbData))
		return FALSE;
	bSerialMode=SERVERMODE;	
	SramRead(pTcpSendPacket,SERIAL_SRAM_INDEX,1,0);
	TcbRun(_pTcbData);
	if (Tcp_bConnectEvent)
	{	// handle connect event here
		Tcp_bConnectEvent = FALSE;
	}
    if (Tcp_bDataEvent)
    {    // HandleSerial messages here
		_RunSerial();
		Tcp_bDataEvent = FALSE;
    }
    if (Tcp_bCloseEvent)
    {	// handle close event here
		TcpClose(_pTcbData);	// Just call TcpClose to ensure, it is ok to call it repeatly
		Tcp_bCloseEvent = FALSE;
	}
    PrepareSerialData();//prepare packet
	_bDataAcked = TcpSend(_iCurMsgPos);
	_iCurMsgPos = 0;
	while(_SerialPortInPosition!=_SerialTcpOutPostion)
	{
   	if (_bDataAcked)
   	{
   		Ne2000WaitPacket();
	      PrepareSerialData();//prepare packet
	     _bDataAcked = TcpSend(_iCurMsgPos);
	   	_iCurMsgPos = 0;
 
   	}
      else break;
    }
   
	SramWrite(pTcpSendPacket,SERIAL_SRAM_INDEX);

    if (Tcp_bFreeEvent)
    {
		// handle free event here, now the tcp connection has shut down already
		SerialInitialize();	// you may re-initialize it here
		Tcp_bFreeEvent = FALSE;
	}
	return TRUE;
}

void SerialHandleInterrupt()
{

 if (_testbit_(RI)) 
 { 
   PCON=PCON|0x40;
   if (SM0_1)//invalid stop bit
   {
     *(_pSerialSendbuf+_SerialPortInPosition)=SBUF;
      if (_SerialPortInPosition<SERIALREVBUFSIZE)
        _SerialPortInPosition++;
       else
        _SerialPortInPosition=0;
   }
    SM0_1=0;
    PCON=PCON&0xBf;
 
 } 
  if(_testbit_(TI))
  {
     if (_SerialPortOutPosition!=_SerialTcpInPostion)
     {
       SBUF=*(_pSerialRevbuf+_SerialPortOutPosition);
       if (_SerialPortOutPosition<SERIALREVBUFSIZE)
        _SerialPortOutPosition++;
       else
        _SerialPortOutPosition=0;
     }
  }

}






⌨️ 快捷键说明

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