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

📄 gsmv100.c

📁 GSM短消息收发程序
💻 C
📖 第 1 页 / 共 3 页
字号:
#include <stdio.h>
#include <absacc.h>
#include "at89c51rc2.h"
#include "GSMv100.h"
#include "CPLD_CONTROLv100.h"
#include <string.h>
#include "generic_operation.h"
#include <intrins.h>
#include "LCDTP_APIv100.H"
#include "flashApi.h"
//#include "unicode.h"
//#include "hzk16.h"

#ifndef uchar
  #define uchar unsigned char
#endif
#ifndef uint
  #define uint unsigned int
#endif

extern bit TP_TOUCHED;
extern void setCsrDir(uchar dir);
extern void putcharLcd(char ch);
extern int putsLcd(unsigned char *str);
extern void ScrGotoxy (unsigned char x,unsigned char y);
extern int printfLcd(char *str);

unsigned char * Changed_No;
unsigned char *DestinationNo;
unsigned int nDstLength;
//unsigned char GB_UnicodeData[];
unsigned char *MessageData;
unsigned int Length;
unsigned idata unicode;
unsigned char *qw;
//定义通讯端口
#define RS232  0
#define GSM    1

#ifndef ON
  #define ON  1
#endif
#ifndef OFF 
  #define OFF  0
#endif
#define    DONE     0x00
#define    FAILURE  0x20

#define    UNICODE_BASE_ADD 460800                 //从FLASH 450K 开始
#define    GB_BASE_ADD      563200                 //从FLASH 550K 开始
#define    ASC_BASE_ADD     307200                 //从FLASH 300K 开始

#define INBUF_LEN 1000
uchar xdata rcv_buf[INBUF_LEN];
uint  rcv_buf_len = 0;
bit   rcv_ovflw_flag = 0;
uchar endflag_counter =0;
bit   rcvend_flag = 0;
extern void ScrGotoxy (unsigned char x,unsigned char y);

/*               
函数名:unsigned char PortOpen(unsigned char channel,unsigned char *para)
功能:  打开指定的通信口。
输入:  channel -> 通信口编号
				0 -> RS232
				1 -> GSM
        para -> 打开通讯口的参数串,例如:
        "9600,8,n,1"含义是:波特率9600,8个数据位,无校验,1个停止位
        RS232支持的波特率有:300,600,1200,2400,4800,9600, 19200, 38400,和115200
        数据位:可以是7或8
        校验方式:o是奇校验;e是偶校验;n是无校验(对数据位为7时,不支持无校验方式)
        停止位:只能是1   
输出:  0x00  	打开成功
        0x02    通讯参数不支持	   
全局变量: 无
调用函数: 无
创建人:   SunnyZ
创建日期: 2003-8-20
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/ 
unsigned char PortOpen(unsigned char channel, unsigned char *para)
{
  switch (channel)
  {
    case RS232:    //RS232
      GSM_switch(0);
      SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
	    BDRCON = 0x00;      //BDRCON: set baud rate created by timer
	    T2CON = 0x00;       //T2CON: set baud rate controlled by timer1
	    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
	    PCON |= 0x80;       //SMOD=1;
	    TH1   = 0xF4;       //Baud:115200  fosc=22.1184MHz
	    TL1   = 0xF4;
	    //IEN0 |= 0x90;       //Enable Serial Interrupt
      TR1   = 1;          // timer 1 run
      //ES = 1;
      break;
    case GSM:    //GSM
      GSM_switch(1);
      SCON  = 0x50;       //SCON: serail mode 1, 8-bit UART, enable ucvr
	    BDRCON = 0x00;      //BDRCON: set baud rate created by timer
	    T2CON = 0x00;       //T2CON: set baud rate controlled by timer1
	    TMOD |= 0x20;       //TMOD: timer 1, mode 2, 8-bit reload
	    PCON |= 0x80;       //SMOD=1;
	    TH1   = 0xF4;       //Baud:4800  fosc=22.1184MHz
	    TL1   = 0xF4;
	    //IEN0 |= 0x90;       //Enable Serial Interrupt
      TR1   = 1;          // timer 1 run
     // ES = 1;
      break;
    default:
      return(0x02);
      break;
  }
}

/*               
函数名: unsigned char PortSendChar(unsigned char channel,unsigned char ch)  
功能:  		使用指定的通信口发送一个字节的数据
            参数:		channel - 通信口编号 
				                0 - RS232
				                1 - GSM
             ch - 待发送的数据(一个字节)
            返回值:		0		成功
                        0x01    该通讯口未打开
                        0x02    非法通道号
输入:     无
输出:     无
全局变量: 无
调用函数: 无
创建人:   ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/ 
unsigned char PortSendChar(unsigned char channel,unsigned char ch)
{
	if(channel>1)
	{
	  return(0x02);
	}

	do{
		SBUF = ch;
		delay(10);
	}while(!TI);

	TI=0;
	return(0x00);
}
/*               
函数名: void send_string_com(unsigned char *str,unsigned int strlen) 
功能:     发送字符串,strlen为字符串长度
输入:     无
输出:     无
全局变量: 无
调用函数: 无
创建人:   ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/ 
void PortSendString(unsigned char channel,unsigned char *str)
{
	unsigned int k=0,l;
	unsigned char *temp_point;
	l = strlen(str);
	temp_point = str;
	do
	{
		if( PortSendChar(channel,*temp_point) == DONE )
		{  
		  temp_point++;
		  k++;
		}
		else
		{
		  beep_switch(ON);
		  delay(10);
		  beep_switch(OFF);
		  disp_str(3,7,"Send Failure!");
      return;
		}
	} while(k < l);
      // disp_str(3,7,"Send Completed!");
}
/*               
函数名: unsigned char PortRecv(unsigned char channel, unsigned char *ch,  unsigned int ms) 
功能:  从指定的通信口, 接收一个字节的数据.
        参数:channel - 通信口编号
				      0 - RS232
				      1 - GSM
              ms - 接收超时时间(毫秒)
              ch - 存放接收到字符的指针.
        返回值:0x00		接收字节成功
                0x01       该通讯口未打开
                0x02		非法通道号
			          0xff		接收失败(超时)
输入:     无
输出:     无
全局变量: 无
调用函数: 无
创建人:   ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/ 
unsigned char PortRecv(unsigned char channel, unsigned char *ch,  unsigned int ms)
{
  uint i=0, j=0;
  if (channel >1)
  {
    return(0x02);
  }
  while(!RI)
  {
  	i++;
  	if(i >= 100 )
  	{
  	    i = 0;
  	    j++;
  	   if(j > ms)
  	  {
  	    return(0xff);
  	  }
    }
  }
  RI = 0;
  *ch = SBUF; 
  //disp_str(0,10,ch);
  return(0x00);
}

/*               
函数名: void receive_string(unsigned char *str,unsigned int strlen) 
功能:     发送字符串,strlen为字符串长度
输入:     无
输出:     无
全局变量: 无
调用函数: 无
创建人:   ldq
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/ 
void receive_string(unsigned char *str,unsigned int strlen)
{ 
	unsigned int i;
	unsigned char *s;
	uchar *temp;
	uint j=0;
	i = 0;
	//str = str + strlen;
	temp = str;
	for(i=0;i<strlen;i++)
	{
RECV_STR:		
		if (PortRecv(1, s, 1000)==0x00)
		{
			*str = *s;
			str++;
		}
		else
		{
		  j++;
		  if (j>1000)
		  {
		  	memcpy(temp,"com error",9);
		  	break;
		  }
		  else
		  {
		    goto RECV_STR;
		  }
		}
	}
}

//==========================================================================
/*               
函数名:   void serial () interrupt 4 using 3
功能:     串口接收中断函数
输入:     无 
输出:     无
全局变量: 
调用函数: 
创建人:   ZLJ
创建日期: 2003-8-19
-----------------------------------------------------------------------------
修改人:   
修改日期: 
描述:     
*/     
void serial () interrupt 4 // using 3
{
	unsigned int i;
	unsigned char *temp_point;
	char sbuf_p[2];
	i = 0;
  if(RI)
  {
    RI = 0; 
    /*
    if((SBUF>0x80) || (SBUF<0x20))
    {
      putcharLcd(0x5f);      //显示不可见字符占位符
    } 
    else
    {
      putcharLcd(SBUF);       //显示接收到的字符
    }*/
    rcv_buf[rcv_buf_len] = SBUF;
    rcv_buf_len++;
    /*if( rcv_buf_len >= 1000 )          //判断接收缓冲区是否溢出
	  {
	    rcv_ovflw_flag = 1;
	    rcv_buf_len = 0;                //重置缓冲区
	  }
	  temp_point = &(rcv_buf[rcv_buf_len-6]);
    temp_point = strrpbrk(temp_point, "\r\nOK\r\n");
    if( temp_point != NULL )
    {
    	rcvend_flag = 1;
    //	rcv_buf_len = 0;
    	
    }  */
  }  
}

/*
函数名:   format_nm(char *nms_buf,char * nms)
功能:     将内码串格式化,主要将半角字符格式化为双字节,输出到nms_buf;
输入:     nms
输出:     nms_buf
全局变量: 
调用函数: readFlash()
创建人:   SunnyZ
创建日期: 2003-12-18
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/
void format_nm( char *nms_buf,char * nms)
{
  uint idata len_temp;
  uint idata i;
  //char nms_buf[500];
  char * nms_p;
  char * nms_pt;
  uchar temp;
  char disp_temp[10];
  //bit bit_temp;
  
  /*bit_temp = EX0;
  EX0 = 1;*/
  nms_pt = nms;
  //memset(nms_buf,0,500);
  nms_p = nms_buf;
  len_temp = strlen(nms);
  for(i=0; i<len_temp; i++)
  {
    temp = *nms;     
    /*sprintf(disp_temp,"nm:%4x", temp);
    ScrGotoxy(3,7);
    putsLcd(disp_temp);   
    while(!TP_TOUCHED);
    TP_TOUCHED = 0;*/
    if(temp < 0x80)
    {
      *nms_p = 0xf8;
      nms_p++;
      *nms_p = 0x80 + temp;
      /*ScrGotoxy(3,8);    
      putsLcd("COME HERE!");
      while(!TP_TOUCHED);
      TP_TOUCHED = 0;*/
    }
    else
    {
      *nms_p = *nms;  
      /*ScrGotoxy(3,9);    
      putsLcd("GO HERE!");
      while(!TP_TOUCHED);
      TP_TOUCHED = 0;*/
    } 
    nms_p++;
    nms++;
  }       
  //EX0 = bit_temp;
  //memcpy(nms_pt, nms_buf, strlen(nms_buf));
}

/*
函数名:   Nm_Unicode(uint Qw_Number)
功能:     将机内码转换为unicode码;
输入:     机内码(十六进制)
输出:     unicode码(十六进制)
全局变量: 
调用函数: readFlash()
创建人:   SunnyZ
创建日期: 2003-12-17
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/

char * Nm_Unicode(uint Jnm_Number)
{
  unsigned long add_p;
  uint  gbm;
  char temp[5];        
  char disp_temp[10];
  /*bit bit_temp;
  
  bit_temp = EX0;
  EX0 = 1;*/
  gbm = Jnm_Number - 0x8080;                  //机内码转换为国标码
  memset(temp,0,5);
  add_p = gbm;
  add_p = add_p - 0x2121;
  add_p = add_p*4;
  add_p = add_p + UNICODE_BASE_ADD;
  //add_p = UNICODE_BASE_ADD + (gbm - 0x2121)*4;
  /*memset(disp_temp,0,10);
  sprintf(disp_temp,"%4x:",gbm);
  ScrGotoxy(2,3);
  putsLcd(disp_temp);*/
  readFlash(add_p,4,temp);                //从FLASH中查找对应的UNICODE
  /*putsLcd(temp);
  while(!TP_TOUCHED);
  TP_TOUCHED = 0;
  EX0 = bit_temp;*/
  return(temp);
}

/*
函数名:   Unicode_Nm(uint Unicode)
功能:     将unicode码转换为机内码;
输入:     unicode码(十六进制)
输出:     机内码(十六进制)
全局变量: 
调用函数: 无
创建人:   SunnyZ
创建日期: 2003-12-17
----------------------------------------------------------------------------
修改人:
修改日期:
描述:
*/

uint Unicode_Nm(uint Unicode_number)
{
  uint  unicode = 0x0000;
  long int add_p;
  uint  gbm;
  uint i = 0;
  char temp[5]={0x00,0x00,0x00,0x00,0x00};
  add_p = GB_BASE_ADD;
  add_p = add_p - 2;
  readFlash(add_p,2,temp);
  gbm = *((int *)temp);                 //从FLASH里查国标码对应的UNICODE
  //getkeycode(0);
  return(gbm + 0x8080); 
  
}


/*
函数名:   Nms_Unicode(uint *dent_buf, uint *src_buf)
功能:     将一串机内码转换为相应的unicode码;
输入:     源串src_buf
输出:     目标串dent_buf
全局变量: GB_UnicodeData[],GB_UnicodeDataZF[][2];

⌨️ 快捷键说明

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