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

📄 chars.c

📁 CML CMX868 modem
💻 C
字号:
//---------------------------------------------------------------------------------------------------
//	Project:-	DE8681
//  	Filename:-	CHARS.C
//	Description:-	Tx and Rx Character processing routines
//	Programmer:-	D.T.F	
//	Version:-	2.0
//	Created:-	28th November 2002
//	Last modified:-
//---------------------------------------------------------------------------------------------------
//	(C) Consumer Microcircuits Ltd 2002
//
//	This firmware was designed by:-
//			Consumer Microcircuits Ltd,
//			Langford, Maldon,
//			ESSEX
//			CM9 6WG.
//	in the UK for use with CML evaluation kits only and is based on UK originated technology.
//	Please contact
//			sales@cmlmicro.co.uk
//			+44 (0)1621 875500
//	for licensing details.
//---------------------------------------------------------------------------------------------------

#define CHARS_C

#include	"ef8681.h"

void rx_atchars(void)
{
	unsigned char tmprx;

	if (sci_getFERR())
	{
		sci_getByte();			// Read SCI receive register
		return;				// Return
	}
		
	tmprx = sci_getByte();			// Read SCI receive register

	// Ignore all chars if the last AT command is still being processed
	// Exit if frame or overrun errors are experienced

	if (sci_checkOERR() || INTERPRET) return;

	// Set abort flag if key pushed during BERT or Test Functions

	if (BERTFLAG || TESTFUNC1 || TESTFUNC2)
	{
		KEYABORT = 1;		// Set flag to indicate abort
		return;
	}

	// Set abort flag if key pushed during handshaking

	if (!ATCMDMODE && !DATAXFER)	// During Handshaking
	{
		KEYABORT = 1;		// Set flag to indicate abort
		return;
	}

	// Ignore chars outside the AT Command character set (echo all chars if required)

	if ((tmprx <= '9' && tmprx >= '0') || (tmprx <= 'Z' && tmprx >= 'A')
		|| (tmprx <= 'z' && tmprx >= 'a') || tmprx == S3 || tmprx == S5
		|| tmprx == '&' || tmprx == '@' || tmprx == '='
		|| tmprx == '?' || tmprx == ',' || tmprx == '%' || tmprx == '*'
		|| tmprx == '#' || tmprx == '/')
	{
		if (ATCHAR)
		{	
			if (tmprx == S3)
			{
				ATBUF[ATBUFPTR] = NUL;	// Null terminate command buffer string 
				REPCMD=1;		// Set repeat command flag
				ATCHAR=0;		// Clear 'AT' char flag
				ACHAR=0;		// Clear 'A' char flag
				INTERPRET=1;		// Set Interpret flag
				CTSN=1;			// Prevent any further chars
			}
			else if (tmprx == S5)
			{
				if (ATBUFPTR != 0) ATBUFPTR--;	// Decrement AT Command Buffer Pointer
			}
			else
			{
				if (ATBUFPTR == 47)	// If command buffer is full
				{
					ATBUF[ATBUFPTR] = NUL;	// Null terminate command buffer string 
					REPCMD=1;		// Set repeat command flag
					ATCHAR=0;		// Clear 'AT' char flag
					ACHAR=0;		// Clear 'A' char flag
					INTERPRET=1;		// Set Interpret flag
					CTSN=1;			// Prevent any further chars
				}
				else
				{
					ATBUF[ATBUFPTR++] = tmprx;	// Load current char into command buffer
									// Increment AT Command Buffer Pointer
				}
			}
		}
		else if (ACHAR)
		{
			if (tmprx == '/')
			{
				ACHAR=0;	// Clear 'A' char flag
				INTERPRET=1;	// Set Interpret flag
				CTSN=1;		// Prevent any further chars
			}

			// If the current char is 'T' or 't' then set 'AT' char flag

			if (tmprx == 'T' || tmprx == 't') ATCHAR=1;


		}
		else
		{
			if (tmprx == 'A' || tmprx == 'a') ACHAR=1;	// Set 'A' char flag
		}
	}
	if (ECHO)				// Echo current rx char if required
	{
		MSGBUF[MSGBUFLDPTR++]=tmprx;

		MSGBUFLDPTR &= msgbufwrap;	// Wrap round buffer if necessary

		if ((tmprx == S3) && WORDRES)		// Check for CR char and word result enabled
		{
			MSGBUF[MSGBUFLDPTR++]= S4;	// Insert additional LF

			MSGBUFLDPTR &= msgbufwrap;	// Wrap round buffer if necessary
		}

		LOADCHAR=1;			// Set load char flag
	}			
}

void tx_chars(void)
{
	if (TXIF)
	{
		if (!RTSN)
		{
			if (MSGBUFRDPTR != MSGBUFLDPTR)
			{
				TXREG = MSGBUF[MSGBUFRDPTR++];
				MSGBUFRDPTR &= msgbufwrap;	// Wrap round buffer if necessary
			}
			else
			{
				TXIE=0;			// Disable Tx interrupt
			}
		}
	}	
}

void rx_datachars(void)
{
	unsigned char tmprx;

	if (sci_getFERR())
	{
		sci_getByte();					// Read SCI receive register
		return;						// Return
	}
		
	tmprx = sci_getByte();					// Read SCI receive register

	// Exit if frame or overrun errors are experienced

	if (sci_checkOERR()) return;

	DATABUF[DATABUFLDPTR++]=tmprx;				// Load Data buffer at buffer location

	DATABUFLDPTR &= databufwrap;				// Wrap round buffer if necessary

	if (((DATABUFLDPTR - DATABUFRDPTR) & databufwrap) >= databufpause)
	{
		CTSN=1;						// Prevent any further chars
	}

	if (ESCTMR == 0)					// If the Escape Timer has expired set the Flag
	{
		ESCTMREXP = 1;
	}

	ESCTMR = S12;						// Reload the Escape Timer

	if (tmprx != S2)
	{
		ESCTMREXP = 0;					// Clear Escape Timer Expired Flag
		ESC1CHAR = 0;					// Clear 1st Escape Character Match Flag
		ESC2CHAR = 0;					// Clear 2nd Escape Character Match Flag
		return;
	}

	if (!ESCTMREXP) return;

	if (!ESC1CHAR)
	{
		ESC1CHAR = 1;					// Set 1st Escape Character Match Flag
		return;
	}

	if (!ESC2CHAR)
	{
		ESC2CHAR = 1;					// Set 2nd Escape Character Match Flag
		return;
	}
	
	ATCMDMODE = 1;						// Escape sequence received so revert back to AT command mode
	 
	DATABUFLDPTR = 0x00;					// Initialise Data Buffer Load pointer
	DATABUFRDPTR = 0x00;					// Initialise Data Buffer Read pointer

	ESCTMREXP = 0;						// Clear Escape Timer Expired Flag
	ESC1CHAR = 0;						// Clear 1st Escape Character Match Flag
	ESC2CHAR = 0;						// Clear 2nd Escape Character Match Flag

	CTSN=0;							// Ensure we can accept new characters
}

⌨️ 快捷键说明

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