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

📄 sms.c

📁 AVR atmega64串口驱动
💻 C
📖 第 1 页 / 共 3 页
字号:
#define sms_c
#include "main.h"
#include "sms.h"

/*uchar buf[]="00000";
void hex_bcd(uint temp)
{
  	uchar a;
	for(a=5;a>0;a--)   //取出每位中的数据
		{
			buf[a-1]=temp%10+48;
			temp/=10;
		}
		if(buf[0]==0x30)//去掉0
	  {
	    buf[0]=0x20;
		if(buf[1]==0x30)
		  {
		   buf[1]=0x20;
		   if(buf[2]==0x30)
		     {
			  buf[2]=0x20;
			  if(buf[3]==0x30)
			   {
			    buf[3]=0x20;
			   }
			 }
		  }
	  }	
	UART0_Transmitstr(buf);
    CR; 	
}*/

//*********TC35初始化***********************//
void tc35_devices(void)
{
	CR;
	DelayMs(500);
	UART0_Transmitstr("ATE0"); 
	CR;
	DelayMs(500);
	UART0_Transmitstr("AT^SSYNC=1"); 
	CR;
	DelayMs(500);
    UART0_Transmitstr("AT+CMGF=0"); 
	CR;
	DelayMs(500);
	UART0_Transmitstr("AT+CNMI=2,1,0"); 
	CR;
	DelayMs(500);
	UART0_Transmitstr("AT+CLIP=1"); 
	CR;
	DelayMs(500);
	UART0_Transmitstr("AT+CPMS=MT"); 
	CR;
	DelayMs(500);
	UART0_Transmitstr("AT&W"); 
	CR;
	DelayMs(500);
	ok=0;
	error=0;
	wdt_reset();//复位看门狗
	while(UART0_DataInReceiveBuffer())UART0_ReceiveByte(); //清空接收区
	wdt_reset();//复位看门狗	
}
//**********************************************************//
//数组内成员计数,依靠0x23判断结束
// 如:13562503079=11
// pSrc: 源数据指针
// 返回: 数组内数据长度
uint countsn(uchar *PSrc)
  {
     uint r=0;
     while(*PSrc!=0x23)
       {
         *PSrc++;
         r++;
       }
     return r;
  }
/*********************************************************************/
// 正常顺序的字符串转换为两两颠倒的字符串,若长度为奇数,补'F'凑成偶数
// 如:"8613851872468" --> "683158812764F8"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
/**********************************************************************/
uchar gsmInvertNumbers(uchar* pSrc, uchar* pDst, uchar nSrcLength)
{
    uchar nDstLength;   // 目标字符串长度
    uchar ch;          // 用于保存一个字符
    
    // 复制串长度
    nDstLength = nSrcLength;
    
    // 两两颠倒
    for(uchar i=0; i<nSrcLength;i+=2)
    {
        ch = *pSrc++;        // 保存先出现的字符
        *pDst++ = *pSrc++;   // 复制后出现的字符
        *pDst++ = ch;        // 复制先出现的字符
    }
    
    // 源串长度是奇数吗?
    if(nSrcLength & 1)
    {
        *(pDst-2) = 'F';     // 补'F'
        nDstLength++;        // 目标串长度加1
    }
    
    // 输出字符串加个结束符
    *pDst = '\0';
    
    // 返回目标字符串长度
    return nDstLength;
}
//********************************************************************
// 两两颠倒的字符串转换为正常顺序的字符串
// 如:"683158812764F8" --> "8613851872468"
// pSrc: 源字符串指针
// pDst: 目标字符串指针
// nSrcLength: 源字符串长度
// 返回: 目标字符串长度
//********************************************************************
uchar gsmSerializeNumbers(uchar* pSrc, uchar* pDst, uchar nSrcLength)
{
    uchar nDstLength;   // 目标字符串长度
    uchar ch;          // 用于保存一个字符
    
    // 复制串长度
    nDstLength = nSrcLength;
    
    // 两两颠倒
    for(uchar i=0; i<nSrcLength;i+=2)
    {
        ch = *pSrc++;        // 保存先出现的字符
        *pDst++ = *pSrc++;   // 复制后出现的字符
        *pDst++ = ch;        // 复制先出现的字符
    }
    
    // 最后的字符是'F'吗?
    if(*(pDst-1) == 'F')
    {
        pDst--;
        nDstLength--;        // 目标字符串长度减1
    }
    
    // 输出字符串加个结束符
    *pDst = '\0';
    
    // 返回目标字符串长度
    return nDstLength;
}
//*********************************************************************//
// 可打印字符串转换为字节数据
// 如:"C8329BFD0E01" --> {0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01}
// pSrc: 源字符串指针
// pDst: 目标数据指针
// nSrcLength: 源字符串长度
// 返回: 目标数据长度
//*********************************************************************//
uchar gsmString2Bytes(uchar* pSrc, uchar* pDst, uchar nSrcLength)
{
    for(int i=0; i<nSrcLength; i+=2)
    {
        // 输出高4位
        if(*pSrc>='0' && *pSrc<='9')
        {
            *pDst = (*pSrc - '0') << 4;
        }
        else
        {
            *pDst = (*pSrc - 'A' + 10) << 4;
        }
    
        pSrc++;
    
        // 输出低4位
        if(*pSrc>='0' && *pSrc<='9')
        {
            *pDst |= *pSrc - '0';
        }
        else
        {
            *pDst |= *pSrc - 'A' + 10;
        }
        pSrc++;
        pDst++;
    }
    
    // 返回目标数据长度
    return nSrcLength / 2;
}
//**************************************************************//
// 字节数据转换为可打印字符串
// 如:{0xC8, 0x32, 0x9B, 0xFD, 0x0E, 0x01} --> "C8329BFD0E01" 
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 目标字符串长度
//*************************************************************//
uint gsmBytes2String(const unsigned char* pSrc, char* pDst, uint nSrcLength)
{
    const char tab[]="0123456789ABCDEF";    // 0x0-0xf的字符查找表
    
    for(uchar i=0; i<nSrcLength; i++)
    {
        // 输出低4位
        *pDst++ = tab[*pSrc >> 4];
    
        // 输出高4位
        *pDst++ = tab[*pSrc & 0x0f];
    
        pSrc++;
    }
    
    // 输出字符串加个结束符
     *pDst = '\0';
    
    // 返回目标字符串长度
    return nSrcLength * 2;
}
//*************************************************************//
//电话号码前的国际代码'86'自动识别
// 如:13562503079--> 8613562503079 
// pSrc: 源数据指针
// pDst: 目标字符串指针
// nSrcLength: 源数据长度
// 返回: 无
//***********************************************************//
void gsmphonegb(uchar *pSrc, uchar *pDst, uchar nSrcLength)
{
uchar i;
  if(*pSrc!='8')
   {
     *pDst++='8';
	 *pDst++='6';
	 for(i=0;i<nSrcLength;i++)
	 {
	  *pDst++=*pSrc++;
	 }
   } 
   else 
   {
    for(i=0;i<nSrcLength;i++)
	{
	  *pDst++=*pSrc++;
	} 
   }
 }  
//******************************************************//
// 将数组a的数据移动到数组b
// 如:a["1234"]__b["1234"]
// pSrc: 源数据指针
// pDst: 目标字符串指针
// 
// 返回: 无
//*****************************************************//	   
uint a_stutob_stu(uchar *pSrc, uchar *pDst,uint n)	 
{ 
    uint i;
    for(i=0;i<n;i++)
    {
      *pDst++=*pSrc++;
    }
   *pDst++=0x23;
   return n;
}
//******************************************************//
// 将数组a的数据移动到数组b
// 如:a["1234"]__b["1234"]
// pSrc: 源数据指针(FLASH)
// pDst: 目标字符串指针
// 
// 返回: 无
//*****************************************************//	 
uint a_conststutob_stu(const uchar *pSrc, uchar *pDst,uint n)	 
{ 
    uint i;
    for(i=0;i<n;i++)
    {
      *pDst++=pgm_read_byte(pSrc+i);
    }
   *pDst++=0x23;
   return n;
}
//******************************************************//
//******************************************************//
// 字符串匹配
// 如:a["12345968487"]与b["1234"]比较
// pSrc: 源数据指针
// pDst: 目标字符串指针
// r 源芝罘串的个数,y目标字符串的个数
// 遇到0,停止
// 返回: 匹配返回原字符串匹配到字节长度,否则返回0
//*****************************************************//
uint string_match(uint r,uchar *pSrc,uchar y,  uchar *pDst)
{ 
    uint i = 0;//外层循环用变量i控制“母串”m[] 由第一个元素到最后一个元素
    uchar j = 0;//内层循环用变量j控制“子串”s[]。 比较子串的第一个元素与外层循环的每一个元素,若不相等,则跳出内层循环,重复上述过程; 若相等则需继续比较第二个元素
    uchar k=0;   /* 偏移量&&累计已经匹配的长度 */
    

    for(i = 0; i < r; i++)
    {
        for(j = 0; j < y; j++)
        {
            if(pDst[j] == pSrc[i + k]) /* 若匹配则记录已经匹配的个数k */
                k++;
            else                 /* 不匹配则跳出该重循环 */
                break;
        }
        if(k == y)
		{
        return i+=k;
		}
        k = 0; /* 偏移量清零 */
    }
		return 0;
}
//*************************************************************//
//光照转换到PDU
//无小数点
//入口转速数据
//出口msg_buf,返回累加后的字节长度
//*************************************************************//
uint sun_d(uint temp,uint n)
{ 
   uchar a=0,i;
   uchar buf[20]={};
   uchar buf1[20]={};
	 for(a=10;a>0;a--)   //取出每位中的数据
		{
		     buf[a-1]=temp%10+48;
			 a--;			           
			 buf[a-1]=0;
			 temp/=10;
		}
			a=0;
    if(buf[1]==0x30)//去掉0
	  {
	    a+=2;
		if(buf[3]==0x30)
		  {
		   a+=2;
		   if(buf[5]==0x30)
		     {
			  a+=2;
			  if(buf[7]==0x30)
			   {
			    a+=2;
			   }
			 }
		  }
	  }
	for(i=0;i<(10-a);i++)
		{
            buf1[i]=buf[a+i];
		}
	n+= gsmBytes2String(buf1, &msg_buf[n], (10-a));//转换到ASCII码
    return n;
}
//************************************************************************//
//转速转换到PDU
//中间添加小数点
//入口转速数据
//出口msg_buf,返回累加后的字节长度
//*********************************************************************//
uint rota_d(uint temp,uint n)
{ 
   uchar a=0,i;
   uchar buf[10]={};
   uchar buf1[10]={};
    for(a=10;a>0;a--)   //取出每位中的数据
	 {
	 if (a!=8)
		{
		     buf[a-1]=temp%10+48;
			 a--;			           
			 buf[a-1]=0;
			 temp/=10;
		}
	 else 
	    {
		    buf[a-1]=0x2E;	//小数点
	        a--;
			buf[a-1]=0;
	    }
	 }	
	a=0;
    if(buf[1]==0x30)//去掉0
	  {
	    a+=2;
		if(buf[3]==0x30)
		  {
		   a+=2;
		  }
	  }

⌨️ 快捷键说明

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