求一个89C51单片机 控制SIM900(相似的也可以),收发短信的程序!
收短信的我弄好了,发短信的我也弄好了,但是两个程序弄在一起就不行了。求高手发个程序,或指点一下,感谢!!...
收短信的我弄好了,发短信的我也弄好了,但是两个程序弄在一起就不行了。求高手发个程序,或指点一下,感谢!!
展开
3个回答
展开全部
代码如下 流程是一致的 只是端口定义不同
#include "sim900a.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "dma.h"
#include "flash.h"
#include "touch.h"
#include "malloc.h"
#include "string.h"
#include "text.h"
#include "usart2.h"
#include "ff.h"
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART2_RX_STA;
// 1,清零USART2_RX_STA;
void sim_at_response(u8 mode)
{
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
printf("%s",USART2_RX_BUF); //发送到串口
if(mode)USART2_RX_STA=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A 各项测试(拨号测试、短信测试、GPRS测试)共用代码
//sim900a发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
// 其他,期待应答结果的位置(str的位置)
u8* sim900a_check_cmd(u8 *str)
{
char *strx=0;
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//向sim900a发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
// 1,发送失败
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART2_RX_STA=0;
if((u32)cmd<=0XFF)
{
while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成
USART2->DR=(u32)cmd;
}else u2_printf("%s\r\n",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART2_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据
USART2_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
//将1个字符转换为16进制数字
//chr:字符,0~9/A~F/a~F
//返回值:chr对应的16进制数值
u8 sim900a_chr2hex(u8 chr)
{
if(chr>='0'&&chr<='9')return chr-'0';
if(chr>='A'&&chr<='F')return (chr-'A'+10);
if(chr>='a'&&chr<='f')return (chr-'a'+10);
return 0;
}
//将1个16进制数字转换为字符
//hex:16进制数字,0~15;
//返回值:字符
u8 sim900a_hex2chr(u8 hex)
{
if(hex<=9)return hex+'0';
if(hex>=10&&hex<=15)return (hex-10+'A');
return '0';
}
//unicode gbk 转换函数
//src:输入字符串
//dst:输出(uni2gbk时为gbk内码,gbk2uni时,为unicode字符串)
//mode:0,unicode到gbk转换;
// 1,gbk到unicode转换;
void sim900a_unigbk_exchange(u8 *src,u8 *dst,u8 mode)
{
u16 temp;
u8 buf[2];
if(mode)//gbk 2 unicode
{
while(*src!=0)
{
if(*src<0X81) //非汉字
{
temp=(u16)ff_convert((WCHAR)*src,1);
src++;
}else //汉字,占2个字节
{
buf[1]=*src++;
buf[0]=*src++;
temp=(u16)ff_convert((WCHAR)*(u16*)buf,1);
}
*dst++=sim900a_hex2chr((temp>>12)&0X0F);
*dst++=sim900a_hex2chr((temp>>8)&0X0F);
*dst++=sim900a_hex2chr((temp>>4)&0X0F);
*dst++=sim900a_hex2chr(temp&0X0F);
}
}else //unicode 2 gbk
{
while(*src!=0)
{
buf[1]=sim900a_chr2hex(*src++)*16;
buf[1]+=sim900a_chr2hex(*src++);
buf[0]=sim900a_chr2hex(*src++)*16;
buf[0]+=sim900a_chr2hex(*src++);
temp=(u16)ff_convert((WCHAR)*(u16*)buf,0);
if(temp<0X80){*dst=temp;dst++;}
else {*(u16*)dst=swap16(temp);dst+=2;}
}
}
*dst=0;//添加结束符
}
//键盘码表
const u8* kbd_tbl1[13]={"1","2","3","4","5","6","7","8","9","*","0","#","DEL"};
const u8* kbd_tbl2[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
u8** kbd_tbl;
u8* kbd_fn_tbl[2];
//加载键盘界面(尺寸为240*140)
//x,y:界面起始坐标(320*240分辨率的时候,x必须为0)
void sim900a_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+140,WHITE);
LCD_DrawRectangle(x,y,x+240,y+140);
LCD_DrawRectangle(x+80,y,x+160,y+140);
LCD_DrawRectangle(x,y+28,x+240,y+56);
LCD_DrawRectangle(x,y+84,x+240,y+112);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl[i],16,80);
else Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80);
}
}
#include "sim900a.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "key.h"
#include "lcd.h"
#include "dma.h"
#include "flash.h"
#include "touch.h"
#include "malloc.h"
#include "string.h"
#include "text.h"
#include "usart2.h"
#include "ff.h"
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART2_RX_STA;
// 1,清零USART2_RX_STA;
void sim_at_response(u8 mode)
{
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
printf("%s",USART2_RX_BUF); //发送到串口
if(mode)USART2_RX_STA=0;
}
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////
//ATK-SIM900A 各项测试(拨号测试、短信测试、GPRS测试)共用代码
//sim900a发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
// 其他,期待应答结果的位置(str的位置)
u8* sim900a_check_cmd(u8 *str)
{
char *strx=0;
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//向sim900a发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
// 1,发送失败
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART2_RX_STA=0;
if((u32)cmd<=0XFF)
{
while(DMA1_Channel7->CNDTR!=0); //等待通道7传输完成
USART2->DR=(u32)cmd;
}else u2_printf("%s\r\n",cmd);//发送命令
if(ack&&waittime) //需要等待应答
{
while(--waittime) //等待倒计时
{
delay_ms(10);
if(USART2_RX_STA&0X8000)//接收到期待的应答结果
{
if(sim900a_check_cmd(ack))break;//得到有效数据
USART2_RX_STA=0;
}
}
if(waittime==0)res=1;
}
return res;
}
//将1个字符转换为16进制数字
//chr:字符,0~9/A~F/a~F
//返回值:chr对应的16进制数值
u8 sim900a_chr2hex(u8 chr)
{
if(chr>='0'&&chr<='9')return chr-'0';
if(chr>='A'&&chr<='F')return (chr-'A'+10);
if(chr>='a'&&chr<='f')return (chr-'a'+10);
return 0;
}
//将1个16进制数字转换为字符
//hex:16进制数字,0~15;
//返回值:字符
u8 sim900a_hex2chr(u8 hex)
{
if(hex<=9)return hex+'0';
if(hex>=10&&hex<=15)return (hex-10+'A');
return '0';
}
//unicode gbk 转换函数
//src:输入字符串
//dst:输出(uni2gbk时为gbk内码,gbk2uni时,为unicode字符串)
//mode:0,unicode到gbk转换;
// 1,gbk到unicode转换;
void sim900a_unigbk_exchange(u8 *src,u8 *dst,u8 mode)
{
u16 temp;
u8 buf[2];
if(mode)//gbk 2 unicode
{
while(*src!=0)
{
if(*src<0X81) //非汉字
{
temp=(u16)ff_convert((WCHAR)*src,1);
src++;
}else //汉字,占2个字节
{
buf[1]=*src++;
buf[0]=*src++;
temp=(u16)ff_convert((WCHAR)*(u16*)buf,1);
}
*dst++=sim900a_hex2chr((temp>>12)&0X0F);
*dst++=sim900a_hex2chr((temp>>8)&0X0F);
*dst++=sim900a_hex2chr((temp>>4)&0X0F);
*dst++=sim900a_hex2chr(temp&0X0F);
}
}else //unicode 2 gbk
{
while(*src!=0)
{
buf[1]=sim900a_chr2hex(*src++)*16;
buf[1]+=sim900a_chr2hex(*src++);
buf[0]=sim900a_chr2hex(*src++)*16;
buf[0]+=sim900a_chr2hex(*src++);
temp=(u16)ff_convert((WCHAR)*(u16*)buf,0);
if(temp<0X80){*dst=temp;dst++;}
else {*(u16*)dst=swap16(temp);dst+=2;}
}
}
*dst=0;//添加结束符
}
//键盘码表
const u8* kbd_tbl1[13]={"1","2","3","4","5","6","7","8","9","*","0","#","DEL"};
const u8* kbd_tbl2[13]={"1","2","3","4","5","6","7","8","9",".","0","#","DEL"};
u8** kbd_tbl;
u8* kbd_fn_tbl[2];
//加载键盘界面(尺寸为240*140)
//x,y:界面起始坐标(320*240分辨率的时候,x必须为0)
void sim900a_load_keyboard(u16 x,u16 y,u8 **kbtbl)
{
u16 i;
POINT_COLOR=RED;
kbd_tbl=kbtbl;
LCD_Fill(x,y,x+240,y+140,WHITE);
LCD_DrawRectangle(x,y,x+240,y+140);
LCD_DrawRectangle(x+80,y,x+160,y+140);
LCD_DrawRectangle(x,y+28,x+240,y+56);
LCD_DrawRectangle(x,y+84,x+240,y+112);
POINT_COLOR=BLUE;
for(i=0;i<15;i++)
{
if(i<13)Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),(u8*)kbd_tbl[i],16,80);
else Show_Str_Mid(x+(i%3)*80,y+6+28*(i/3),kbd_fn_tbl[i-13],16,80);
}
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询