试验了下原子哥代码,写了个简单的程序,想通过lcd驱动文件内的显示函数LCD_Showstring显示sim900a返回的数据(例如运营商什么的),但什么都不显示,想是不是sim900a返回的数据用这个函数输出不了[mw_shl_code=c,true]#include "sim900a.h"
#include "usart.h"
#include "delay.h"
#include "lcd.h"
#include "string.h"
#include "usart2.h"
#include "remote.h"
#include "malloc.h"
//命令检查
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发送命令
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
",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;
}
void sim900a_simcard_info(void)
{
u8 *p,*p1,*p2;
//u8 res=0;
p=mymalloc(SRAMIN,50);//申请50个字节的内存
POINT_COLOR=BLUE;
USART2_RX_STA=0;
if(sim900a_send_cmd("AT+CPIN?","OK",200)) //查询SIM卡是否在位
USART2_RX_STA=0;
if(sim900a_send_cmd("AT+COPS?","OK",200)==0) //查询运营商名字
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),""");
if(p1)//有有效数据
{
p2=(u8*)strstr((const char*)(p1+1),""");
p2[0]=0;//加入结束符
sprintf((char*)p,"company:%s",p1+1);
LCD_ShowString(60,70,200,16,16,p);
}
USART2_RX_STA=0;
}
if(sim900a_send_cmd("AT+CSQ","+CSQ:",200)==0) //查询信号质量
{
p1=(u8*)strstr((const char*)(USART2_RX_BUF),":");
p2=(u8*)strstr((const char*)(p1),",");
p2[0]=0;//加入结束符
sprintf((char*)p,"sig quantity:%s",p1+2);
LCD_ShowString(60,90,200,16,16,p);
USART2_RX_STA=0;
}
myfree(SRAMIN,p);
}
//sim900a模块总测试
//红外遥控音量键VOL选择拨号功能或者短信功能
//显示见面的逻辑......
void sim900a_test(void)
{
POINT_COLOR = RED;
LCD_ShowString(60,50,200,16,16,"made by anyuxin");
//sim900a_send_cmd("ATE0","OK",200);
sim900a_simcard_info();
}
[/mw_shl_code]
一周热门 更多>