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

📄 uartcomm.c

📁 用于小商品消费的SMS消费机程序
💻 C
📖 第 1 页 / 共 2 页
字号:

/*
 * 接收数据
 * 参数 out: sendBuf  接收到的数据区(包括一位开始位、2位长度位和2位校验位)
 *         : sendLen  接收到的数据区的长度(byte)
 *
 * 返回: 0 接收成功  -1 接收失败
 */
short UART_receive(void *recBuf, unsigned short *recLen)
{
	typ_msg_word msg_buffer;
        typ_UART_stat_word Ustat;
        unsigned char *buf;
	unsigned char sendBuf[6];
        unsigned short checksum,recCount=0;
        short result;
	
//	clr_scr();	
//	move_cursor(0,0);
//	puts("UART_receive");
//	getch();

	Ustat.l_word = UART_stat();
	if (!Ustat.bits.UART_on)
		return 1;	 
 	move_cursor(0,gcCommMsgRow);
	puts("接收数据...");
	if(gcCommMsgRow<6)
		gcCommMsgRow += 2;
	else
		gcCommMsgRow = 2;
	
      
	SPT_set(64);  //time_out = 4s
	buf = (unsigned char *)recBuf;
	//等到数据到来
	while(1)
	{
		msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
		if (msg_buffer.bits.comm_data)
			break;
		if (msg_buffer.bits.time_out)
			return 2;
	}
	
	//接收数据
	do {
		buf[recCount++] = (unsigned char)UART_get_char();
		if(recCount == 1 && buf[0] != 0xBE)//丢弃不是以开始位(0xBE)开始的所有数据
			recCount = 0;
		//接收完了指定帧长,离开循环
		else if ( recCount > 3 && recCount == ( (((unsigned short)buf[1])<<8) + buf[2] ) )
			break;
		else if (recCount >= MAX_BUF_SIZE)
			break;
		Ustat.l_word = UART_stat();
        } while (Ustat.bits.buff_data_available);//否则一直接收到接收缓冲区没有数据
        
        *recLen = recCount;
        
        //判断数据帧的合法性,并且回应对应的数据帧
        checksum = cal_chksum((void *)buf, recCount-2);
        //Dispbcd(0,0,buf+recCount-2,2);
	sendBuf[0] = checksum >> 8;
	sendBuf[1] = checksum & 0xFF;
        //Dispbcd(0,6,sendBuf,2);
        if ((recCount < 6) ||(buf[0] != 0xBE)||(buf[recCount-2] != sendBuf[0])||(buf[recCount-1] != sendBuf[1]))
        {
		sendBuf[0] = 0xBE;
		sendBuf[1] = 0x00;
		sendBuf[2] = 0x06;
		sendBuf[3] = 0xFF;//0xFF代表接收出错
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		result = 3;
        }
        else
        {
		sendBuf[0] = 0xBE;
		sendBuf[1] = 0x00;
		sendBuf[2] = 0x06;
		sendBuf[3] = 0x00;//0x00代表接收正确
		checksum = cal_chksum((void *)sendBuf, 4);
		sendBuf[4] = checksum >> 8;
		sendBuf[5] = checksum & 0xFF;
		UART_puts(sendBuf,6);
		result = 0;
        }	

//	msg_buffer.s_word = sys_msg(SM_STAY_AWAKE);
//	if(msg_buffer.bits.time_out) 
//		return 4;//
	
	return result;
}
/*************************************************************************/
/*MC35 power on and initialize                                           */
/*************************************************************************/
void GSM_on(void) 
{
	UART_init(UART_MODEM_ON | UART_ON | UART_8_DATA_BITS | UART_BAUD_57600);  //UART initlizate
	UART_fcntl(UART_fcntl(UART_F_INQ) | UART_F_NO_CTS);
	pModem_power_on();	
	GSM_State = GSM_POWER_ON;
	delay_n_ms(2000);
}

/*************************************************************************/
/*MC35 power off                                                         */
/*************************************************************************/
void GSM_off(void) 
{
	if(GSM_State == GSM_POWER_OFF)
		GSM_on();
	
//	if(GSM_State == GSM_POWER_OFF)
//	{
//		return;
//	}
	
	Send_AT_Command("AT^SMSO\r"); 	//Switch off mobile station
	delay_n_ms(200);
	pModem_power_off(); 
	UART_init(UART_OFF);
	GSM_State = GSM_POWER_OFF;
	delay_n_ms(2000); //Necessary delay for MC35 off line 
}

/*************************************************************************/
/*MC35 config subroutine                                                 */
/*************************************************************************/
unsigned char MC35_Configure(void){
        char  RectCode, *Ptr, Cmd[256], Response[256];
        unsigned short Resp_Length, i=0;
        typ_RTC_date_rec Date;
	typ_RTC_time_rec Time;   
        char * const AT_Command[] = {	"AT\r",
        				"ATE0\r",	//Close echo
        				"AT+CMGF=0\r",	//Set SMS PDU model
        			//	"AT+CSCA=\"+8613010888500\"\r",//Set SMS Center Address
        			//	"AT+CSCA=\"+8613010305500\"\r",//Set SMS Center Address
       					"AT+CSCA=\"+8613800755500\"\r",//Set SMS Center Address
        				"AT+CSCS=GSM\r",//Set SMS character set        				
        				"AT+CSMP=17,167,0,4\r",
        				"AT^SSYNC=1\r",	//Enables the SYNC pin to control a status LED installed 
        				"AT^SCTM=0,1\r",//Setting for query temperature  
        				"AT^SSMSS=1\r",	//Set Short Message Storage Sequence 
        				//"AT+CPMS=\"ME\",\"ME\",\"MT\"\r"
        				"AT+CPMS=\"SM\",\"SM\",\"MT\"\r",//Set preferred SMS message storage    	
        				0};
     
        Send_AT_Command("ATZ\r"); //MC35 software reseat first 
        delay_n_ms(200);        
        while(AT_Command[i])
        {
        	memset(Cmd, 0, sizeof(Cmd));
        	if(i==3)        	
        	{
        		sprintf(Cmd, "AT+CSCA=\"%s\"\r", SMSCenterNo);
			Send_AT_Command(Cmd);
//			set_console_english();
//			move_cursor(0,0);
//			puts(Cmd);
//			move_cursor(0,1);
//			puts(Cmd+16);
//			Dispbcd(0,4, Cmd, 30);
//			set_console_chinese();
			i++;
        	}        	
        	else
			Send_AT_Command(AT_Command[i++]);
		RectCode = Get_AT_Response(Response, &Resp_Length, 1000);
        	if(RectCode != AT_OK)
        	{
		#ifdef DEBUG
			move_cursor(0,2);
			if(RectCode == AT_ERROR)
				printf("ERROR=%d", i);
			else if(RectCode == AT_TIMEOUT)
				printf("TIMEOUT=%d", i);
			delay_n_ms(3000);
		#endif			
			return _false;	
		}
        }
        
             
//	Send_AT_Command("AT+CCLK?\r");
//        if(Get_AT_Response(Response, &Resp_Length, 200) == AT_OK)
//        {
//        	set_console_english();
//        	DispInt(0,0,Resp_Length);
//                Ptr = strstr(Response,"\"");
//        	Dispbcd(0,1,Ptr, 40);
//        	set_console_chinese();
//                Date.fields.year   = atoi(Ptr+1) + 2000;
//                Date.fields.month  = atoi(Ptr+4);
//                Date.fields.day    = atoi(Ptr+7);
//                Time.fields.hour   = atoi(Ptr+10);
//                Time.fields.minute = atoi(Ptr+13);
//                Time.fields.second = atoi(Ptr+16);
//	#ifdef DEBUG
//              move_cursor(0,4);
//              printf("%d/%d/%d,%d:%d:%d", Date.fields.year, Date.fields.month, Date.fields.day, Time.fields.hour, Time.fields.minute, Time.fields.second);
//		delay_n_ms(2000);
//	#endif	
//	        RTC_set_date(Date.l_word);
//	        RTC_set_time(Time.l_word);
//	        return _true;
//	}
//	else
//		return _false;
	return _true;
}

/*************************************************************************/
/*MC35 config menu                                                       */
/*************************************************************************/
unsigned char GSM_configure(void)
{
	int i = 0;
		
        if(GSM_State == GSM_POWER_OFF)
	{
		return;
	}
        
        while(MC35_Configure() == _false)
        {
        	i++;
        	//if(i>10) return 0;
        }        
        
        GSM_State = GSM_CONFIGURED;

        return 1;
}

/*************************************************************************/
/*Send SMS                                                               */
/*************************************************************************/
unsigned char SendSMS(unsigned char *cDataToSend, unsigned char cLen)
{
	short ch;
        SMS_Type SMS;         

	if(GSM_State != GSM_CONFIGURED)
	{
		return 0;
	}

	memset(&SMS, 0, sizeof(SMS_Type));
	SMS.TP_PID = 0x00;
	SMS.TP_DCS = GSM_8BIT;
	SMS.TP_VP = 0x00;
	strcpy(SMS.SCA.Address_Value, SMSCenterNo+1);
//	move_cursor(0,0);
//	puts(SMS.SCA.Address_Value);
//	getch();
	SMS.SCA.Address_Type = 0x91;	
        strcpy(SMS.TPA.Address_Value, CenterNo);    
        SMS.TPA.Address_Type = 0xa1;
        memcpy(SMS.TP_UD, cDataToSend, cLen);
        SMS.TP_UDL = cLen;
	
        if(Send_SMS(&SMS) == _true)
                return 1;
        else
		return 0;
}

/*************************************************************************/
/*Read SMS                                                               */
/*************************************************************************/
unsigned char ReadSMS(unsigned char *cBuffer)
{
	unsigned short Number, Key, CurrentIndex=0;
	SMS_Type SMS_Array[32]; 

	if(GSM_State != GSM_CONFIGURED)
	{
		return 0;
	}
	
	Number = Read_SMS(REC_UNREAD, SMS_Array);		
	if(Number > 0)
	{
		for(CurrentIndex=0;CurrentIndex<Number;CurrentIndex++)
		{
			if(memcmp(SMS_Array[CurrentIndex].TP_UD, "EKT", 3)==0)
			{
				memcpy(cBuffer, &SMS_Array[CurrentIndex].TP_UD, 162);
				Delete_SMS(SMS_Array[CurrentIndex].Index);
				break;
			}
		}			
        }
}

/*************************************************************************/
/*MC35 hang up                                                           */
/*************************************************************************/
unsigned char Hang_Up(void)
{
	unsigned char  Response[256];
        unsigned short Resp_Length;
        
	Send_AT_Command("+++");
        if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
                return _false;
                
	Send_AT_Command("ATH\r");
        if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
                return _false;
	
	Send_AT_Command("AT\r");
        if(Get_AT_Response(Response, &Resp_Length, 5000) != AT_OK)
                return _false;
           
	return _true;
}


/*************************************************************************/
/*MC35 dial out function menu                                            */
/*************************************************************************/
unsigned char Dial_Out(void)
{
	unsigned short KeyIndex=0, URIndex=0;
	unsigned char AT_Command[64];

	if(GSM_State != GSM_CONFIGURED)
	{
		return 0;
	}	

	strcpy(AT_Command, "ATD");
	strcat(AT_Command, CenterNo);
	strcat(AT_Command, "\r");
	Send_AT_Command(AT_Command);	
        if(UART_wait_str("CONNECT", 50000) != _true)
        {
		return 0;
	}
	return 1;
}

⌨️ 快捷键说明

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