void USART2Write(u8* data,u16 len)
{
u16 i;
USART_ClearFlag(USART2, USART_FLAG_TC);//清除数据发送完成标志位 开始本次发送
for (i=0; i<len; i++)
{
USART_SendData(USART2, data);
while(USART_GetFlagStatus(USART2,USART_FLAG_TC) == RESET);//等待发送结束
}
}
//检测sim900a是否返回正确的操作响应 必须检测到此次发送OK了 才发送下一个命令
u8* Sim900a_Check_Cmd(u8* str)
{
char *strx=0;
if(USART_RX_STA & 0X8000) //接收到一次数据了
{
USART_RX_BUF[USART_RX_STA & 0X7FFF]=0; //添加结束符
strx=strstr((const char*)USART_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
//单片机发送指令给SIM900A模块
u8 Sim900a_Send_Cmd(u8* SeCmd, u16 SeLen, u8* reCmd, u16 waitTime) //SEND and ACK Handle
// LCD_ShowString(30,140,240,320,16, Sim900a_Check_Cmd(reCmd));
}
//模块上电之后就发送 AT ATE0 测试下 关回显 -------
经测试 是没有问题的
u8 Open_Sim900a(void)
{
POINT_COLOR = RED;
if(STATUS) //一直为高 说明GSM模块供电正常了
{
while(Sim900a_Send_Cmd((u8*)"AT",5, (u8*)"OK",200)) //return fail cmd
{
LCD_ShowString(10, 90, 240, 320, 16,"Failed to connect GSM ");
delay_ms(800);
LCD_ShowString(10, 90, 240, 320, 16,"connected GSM again ");
delay_ms(800);
}
Boot_State = 0; //链接GSM模块成功
while(Sim900a_Send_Cmd((u8*)"ATE0",4, (u8*)"OK", 200)) //关闭回显
{
LCD_ShowString(10, 90, 240, 320, 16,"failed to close auto return ");
delay_ms(800);
LCD_ShowString(10, 90, 240, 320, 16," ");
delay_ms(800);
}
}
return Boot_State;
}
//Sim900a 接听电话 ------- 可以正常打电话
u8 Sim900a_ATD_PHONE(void)
{
u8 flag;
if(Sim900a_Send_Cmd((u8*)"ATD18502553670;",15, (u8*)"\r\nOK\r\n", 200)) //return fail cmd
{
flag = 1;
}
else flag =0;
//省略。。
return flag;
}
以上代码 打电话没问题 、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、、
以下则是问题所在
我想获取一下信号值 -- AT+CSQ .... “+CSQ:21,0” 想得到21这个信号值 之后还会有很多类似的问题需要处理 大家看看我这个单片机发送和SIM900A接收没问题了吧 反过来我就发现有问题 但是无处着手
所以斗胆问问
用的是原子哥的与战舰调试的代码 改了一点点
程序就死在这里了 ……
u8 p[20], *p1,*p2;
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,"信号质量:%s",p1+2);
// Show_Str(x,y+20,200,16,p,16,0);
LCD_ShowString(10,120,240,320,16,(u8*)p);
USART2_RX_STA=0;
}
我的问题是 我该如何获取模块返回给我的有效的数据 串口中断收 是 原子哥的没有改动 。。。
void USART2_IRQHandler(void) //串口2中断服务程序
{
u8 Res;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET) //接收中断(接收到的数据必须是0x0d 0x0a结尾)
{
Res =USART_ReceiveData(USART2) & 0x7f; //(USART1->DR); 读取接收到的数据
USART_ClearITPendingBit(USART2, USART_IT_RXNE); //清除接收完成标志位
if((USART_RX_STA & 0x8000) == 0) //接收未完成
{
if(USART_RX_STA & 0x4000) //接收到了0x0d
{
if(Res != 0x0a)
USART_RX_STA = 0; //接收错误,重新开始
else
USART_RX_STA |= 0x8000; //接收完成了
// LCD_ShowString(10, 150, 240, 320, 16, USART_RX_BUF);
}
else //还没收到0X0D 结束位
{
if(Res == 0x0d)
USART_RX_STA |= 0x4000;
else
{
USART_RX_BUF[USART_RX_STA & 0X3FFF] = Res; //计算长度
USART_RX_STA++;
// LCD_ShowString(10, 170, 240, 320, 16, USART_RX_BUF);
if(USART_RX_STA > (USART_REC_LEN-1))
USART_RX_STA=0; //接收数据错误,重新开始接收
}
}
}
}
}