📄 serial.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 + -