📄 sms.c
字号:
#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 + -