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

📄 at_com.c

📁 一个操作系统源代码 用于嵌入式设备 在Vc++环境下仿真 成功移植到多款处理器上
💻 C
字号:
#include <stdio.h>
#include <string.h>

#include <kernel\ros33\ros33.h>

#include <sys\lmalloc.h>
#include <sys\sysmsg.h>
#include <sys\systmr.h>
#include <sys\sysusr.h>
#include <sys\syserr.h>
#include <sys\at.h>

#include <service\psst\at_pdu.h>
#include <service\psst\psat.h>

void ATCommand( short comType, char *par1, char *par2 )
{
	char	*comstr;
	long	i, slen, msgLen;
	static char	*smsdata = NULL;
	ID		tid;

	switch( comType )
	{
		case AT_COM_AT:
			{
				comstr = (char *)SysLmalloc( 5 );
				if( comstr == NULL )
					return;
				
				memcpy( comstr, "at\r\n", 5 );
			}
			break;
		case AT_COM_ATD:
			{
				if( par1 == NULL || strlen(par1) > 23 )
					return;

				comstr = (char *)SysLmalloc( 30 );
				if( comstr == NULL )
					return;
				
//				AtCommState = AT_COMM_APPEAL;
				
				memcpy( comstr, "atd", 4 );
				strcat( comstr, par1 );
				strcat( comstr, ";\r\n" );
			}
			break;
		case AT_COM_ATH:
			{
				comstr = (char *)SysLmalloc( 6 );
				if( comstr == NULL )
					return;
				
//				AtCommState = AT_COMM_DISCONNECT;
				
				memcpy( comstr, "ath\r\n", 6 );
			}
			break;
		case AT_COM_ATA:
			{
				comstr = (char *)SysLmalloc( 6 );
				if( comstr == NULL )
					return;
				
//				AtCommState = AT_COMM_CONNECT;

				memcpy( comstr, "ata\r\n", 6 );
			}
			break;
		case AT_COM_ATE:
			{
				if( par1 == NULL || strlen(par1) > 1 )
					return;
				
				comstr = (char *)SysLmalloc( 7 );
				if( comstr == NULL )
					return;
				
				memcpy( comstr, "ate", 4 );
				strcat( comstr, par1 );
				strcat( comstr, "\r\n" );
			}
			break;
		case AT_COM_ATX:
			{
				if( par1 == NULL || strlen(par1) > 1 )
					return;
				
				comstr = (char *)SysLmalloc( 7 );
				if( comstr == NULL )
					return;
				
				memcpy( comstr, "atx", 4 );
				strcat( comstr, par1 );
				strcat( comstr, "\r\n" );
			}
			break;
		case AT_COM_CMGS:
			{
				SMS_SUBMIT_PDU_CONTENT ssc;
				int		llen;
				MSG		datamsg;

				if( par1 == NULL || par2 == NULL )
					return;
				
				// send command
				{
					comstr = (char *)SysLmalloc( 20 );
					if( comstr == NULL )
						return;
					
					ssc.tsmc = 0x91;
					ssc.sa = "8613800250500"; //"8613800250540";//
					ssc.fo = 0x11;
					ssc.mr = 0x00;
					ssc.tn = 0x91;
					ssc.oa = par1;
					ssc.pid = 0x00;
//					ssc.dcs = 0x00;	// uncompressed default alphabet
					ssc.dcs = 0x08;	// uncompressed UCS2
//					ssc.dcs = 0x04;	// uncompressed 8bit
					ssc.vp = 0xaa;
					ssc.ud = par2;
					
					strcpy( comstr, "AT+CMGS=" );
					smsdata = TranslateSSPC( &ssc, &msgLen );
					sprintf( &comstr[8], "%d", msgLen );
					llen = strlen( comstr );
					i = llen;
					comstr[i++] = 0x0d;	// <CR>
					comstr[i] = '\0';					
				}

				get_tid( &tid );
				SendAT( tid, (WORD)strlen(comstr), comstr );
				if( WaitATCommandResponse( &datamsg, AT_COM_CMGS ) != AT_RPS_OK )
					return;
				
				// transfer data
				{
					comstr = (char *)SysLmalloc( MAX_AT_SMS_LEN );
					if( comstr == NULL )
						return;
					
					slen = strlen( smsdata );
					memcpy( comstr, smsdata, slen );
					comstr[slen] = 0x1a;	// ^Z
					comstr[slen+1] = '\0';
					
					smsdata = NULL;
				}
			}
			break;
		case AT_COM_CMGR:
			{					
				if( par1 == NULL || strlen(par1) > 3 )
					return;

				comstr = (char *)SysLmalloc( 15 );
				if( comstr == NULL )
					return;
				
				memcpy( comstr, "at+cmgr=", 9 );
				strcat( comstr, par1 );
				strcat( comstr, "\r\n" );
			}
			break;
		case AT_COM_CMGD:
			{					
				if( par1 == NULL || strlen(par1) > 3 )
					return;

				comstr = (char *)SysLmalloc( 15 );
				if( comstr == NULL )
					return;
				
				memcpy( comstr, "at+cmgd=", 9 );
				strcat( comstr, par1 );
				strcat( comstr, "\r\n" );
			}
			break;
		case AT_COM_CMGF:
			{
				comstr = (char *)SysLmalloc( 15 );
				if( comstr == NULL )
					return;
				
				if( par1 == NULL )
					memcpy( comstr, "at+cmgf?\r\n", 11 );
				else
				{
					
					if( par1 == NULL || strlen(par1) > 1 )
					{
						SysLfree( comstr );
						return;
					}

					memcpy( comstr, "at+cmgf=", 9 );
					strcat( comstr, par1 );
					strcat( comstr, "\r\n" );
				}
			}
			break;
		case AT_COM_CLIP:
			{
				comstr = (char *)SysLmalloc( 13 );
				if( comstr == NULL )
					return;
				
				if( par1 == NULL )
					memcpy( comstr, "at+clip?\r\n", 11 );
				else
				{
					if( par1 == NULL || strlen(par1) > 1 )
					{
						SysLfree( comstr );
						return;
					}
					
					memcpy( comstr, "at+clip=", 9 );
					strcat( comstr, par1 );
					strcat( comstr, "\r\n" );
				}
			}
			break;
		case AT_COM_CNMI:
			{
				comstr = (char *)SysLmalloc( 25 );
				if( comstr == NULL )
					return;
				
				if( par1 == NULL )
					memcpy( comstr, "at+cnmi?\r\n", 11 );
				else
				{					
					if( par1 == NULL || strlen(par1) > 10 )
					{
						SysLfree( comstr );
						return;
					}

					memcpy( comstr, "at+cnmi=", 9 );
					strcat( comstr, par1 );
					strcat( comstr, "\r\n" );
				}
			}
			break;
		default:
			break;
	}

	get_tid( &tid );

	SendAT( tid, (WORD)strlen(comstr), comstr );

	return;
}

short WaitATCommandResponse( MSG *pmsg, short comType )
{
//	MSG		msg;
	short	quit = 0;

	if( pmsg == NULL )	// parameter error
		return SYS_PAR;

	while( !quit )
	{
		if( SysRecvMessage( pmsg, 1000 ) != SYS_OK )	// time out
		{
			EndWaitResponse( );
			return SYS_TMOUT;
		}

		if( pmsg->message == SM_AT )
		{
			switch( comType )
			{
				case AT_COM_AT:
				case AT_COM_ATE:
				case AT_COM_ATX:
				case AT_COM_CMGD:
					if( pmsg->lparam != AT_RPS_OK )
						return SYS_ERR;
					
					quit = 1;
					break;
				case AT_COM_CMGF:
					switch( pmsg->lparam )
					{
						case AT_RPS_OK:
						case AT_RPS_CMGF:
							quit = 1;
							break;
						default:
							return SYS_ERR;
					}
					break;
				case AT_COM_CLIP:
					switch( pmsg->lparam )
					{
						case AT_RPS_OK:
						case AT_RPS_CLIP:
							quit = 1;
							break;
						default:
							return SYS_ERR;
					}
				case AT_COM_CNMI:
					switch( pmsg->lparam )
					{
						case AT_RPS_OK:
						case AT_RPS_CNMI:
							quit = 1;
							break;
						default:
							return SYS_ERR;
					}
				case AT_COM_CMGS:
					switch( pmsg->lparam )
					{
						case AT_RPS_OK:
						case AT_RPS_READY:
							quit = 1;
							break;
						default:
							return SYS_ERR;
					}
				default:
					break;
			}
		}
	}
	
	return SYS_OK;
}

⌨️ 快捷键说明

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