初级会员

- 积分
- 136
- 金钱
- 136
- 注册时间
- 2016-2-29
- 在线时间
- 25 小时
|
1金钱
sim900a.c
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //½óêÕ»o3å,×î′óUSART3_MAX_RECV_LEN¸ö×Ö½ú.
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //·¢Ëí»o3å,×î′óUSART3_MAX_SEND_LEN×Ö½ú
//15:1½óêÕμ½êy¾Y£¬0û½óêÕμ½êy¾Y
//[14:0]:½óêÕμ½μÄêy¾Y3¤¶è
vu16 USART3_RX_STA=0; //unsigned short int
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3,USART_IT_RXNE)!=RESET)//½óêÕμ½êy¾Y
{
res=USART_ReceiveData(USART3);
if(USART3_RX_STA&(1<<15)==0)//»1Î′½óêüíêÕaÅúêy¾Y,2»Äü½óêÕÆäËûêy¾Y
{
if(USART_RX_STA<USART3_MAX_RECV_LEN)//»o3åÇøÃ»óDÂú£¬»1¿é½óêÕ
{
//′Ëê±ó|½«¼ÆêyÆ÷Çå¿Õ,ÖØD¿aê¼¼Æê±£¬¼ÆêyÆ÷3ìDòûD′
TIM_SetCounter(TIM2,0);
///////////////////////////////////////////////////
if(USART_RX_STA==0)
{
TIM_Cmd(TIM2,ENABLE);//ê1Äü¶¨ê±Æ÷μÄÖD¶Ï
}
USART3_RX_BUF[USART3_RX_STA++]=res;//¼Ç¼êÕμ½μÄÖμ
}else
{
USART_RX_STA|=1<<15;//Ç¿ÖÆ±êê¾Îa½óêÕíê3é
}
}
}
}
//3õê¼»ˉ′®¿ú3
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;//¶¨òå3õê¼»ˉ½á11ìå
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;
//×¢òa′®¿ú3ê±ÖóêÇ1òÔØÔúAPB1×üÏßéÏ
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOBê±Öó
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //′®¿ú3ê±Öóê1Äü
USART_DeInit(USART3);//¸′λ′®¿ú3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;//PB10
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//¸′óÃíÆíìêä3ö
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//êä3öÆμÂê50MHz
GPIO_Init(GPIOB,&GPIO_InitStructure);//½á11ìåÔaËØD′èë½á11ìå
// USART3_RX PB11
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_11;//PB11
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;//¸¡¿Õêäèë
GPIO_Init(GPIOB,&GPIO_InitStructure);//3õê¼»ˉPB11
USART_InitStructure.USART_BaudRate=bound;//2¨ìØÂê9600
USART_InitStructure.USART_HardwareFlowControl=USART_HardwareFlowControl_None;//ÎTó2¼tá÷¿ØÖÆ
USART_InitStructure.USART_Mode=USART_Mode_Rx | USART_Mode_Tx;//′®¿úêÕ·¢Ä£ê½
USART_InitStructure.USART_Parity=USART_Parity_No;//ÎTD£Ñé
USART_InitStructure.USART_StopBits=USART_StopBits_1;//1λí£Ö1λ
USART_InitStructure.USART_WordLength=USART_WordLength_8b;//×Ö3¤Îa8λ
USART_Init(USART3,&USART_InitStructure);//D′èë½á11ìå
USART_Cmd(USART3,ENABLE);//ê1Äü′®¿ú
USART_ITConfig(USART3,USART_IT_RXNE,ENABLE);//¿aÆô′®¿úÖD¶Ï
//éèÖÃÖD¶ÏóÅÏè¼¶
NVIC_InitStructure.NVIC_IRQChannel=USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2;//ÇàÕ¼óÅÏè¼¶2
NVIC_InitStructure.NVIC_IRQChannelSubPriority=3;//Ïìó|óÅÏè¼¶3
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
//////»1DèéèÖö¨ê±Æ÷ÖD¶Ï£¬3¬1y10ms×Ô¶ˉ·ÅÆú±¾′νóêÕ
//TIM2_Init(99,7199);//¶¨ê±10ms
//TIM2_Int_Init(99,7199);
USART3_RX_STA=0;//Çå0 ±êÖ¾
TIM_Cmd(TIM2,DISABLE);//1رն¨ê±Æ÷2
}
///////////////////////////////////////////////////////////////////////////////
//′®¿ú3 printfoˉêy
void u3_printf(char*fmt,...)
{
va_list ap;
u16 i,j;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //′Ë′η¢Ëíêy¾YμÄ3¤¶è);
for(j=0;j<i;j++) //Ñ-»··¢Ëíêy¾Y
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //Ñ-»··¢Ëí,Ö±μ½·¢Ëííê±Ï
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
////////////////////////////////////////////////////////////////////////
//str:Æú′yμÄó|′e½á1û//0:NULLûóDμÃμ½Æú′y½á1û
//′ó½óêÕμ½μÄUSART3_RX_BUFÖDѰÕòstr,èôóD£¬·μ»ØÖμÎastr
u8* sim900a_check_cmd(u8 *str)
{
char *strx;
if(USART3_RX_STA&0X8000)//½óêÕμ½ò»′Îêy¾Y
{
USART3_RX_BUF[USART3_RX_STA&0X7FFF]=0;//ìí¼ó½áêø·û
strx=strstr((const char*)USART3_RX_BUF,(const char*)str);
}
return (u8*)strx;
}
///////////////////////////////////////////
//·μ»ØÖμ0:½óêÕ3é1|1:½óêÕê§°ü
//cmd:·¢ËíμÄÃüáîack:Æú′yμÄó|′e½á1ûwaittime:μè′yê±¼ä μ¥λ:10ms
u8 sim900a_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;//Ôú3ìDòÖDresμÄÖμ±£3ÖÎa0ÔòÎa3é1|½óêÕ
USART3_RX_STA=0;
if((u32)cmd<=0xff)
{
while((USART3->SR&0X40)==0);//μè′yéÏò»′Îêy¾Y·¢Ëííê3é
USART3->DR=(u32)cmd;//êy¾Y·Åèëdata¼Ä′æÆ÷
}else u3_printf("%s\r\n",cmd);//·¢ËíÃüáî
if(ack&&waittime)//μè′yó|′e
{
while(--waittime)//waittime*10ms
{
delay_ms(10);
if(USART3_RX_STA&0X8000)
{
if(sim900a_check_cmd(ack))break;//μÃμ½óDD§êy¾Y
USART_RX_STA=0;
}
}
if(waittime==0)res=1;//μè′yê±¼äòÑμ½£¬»1ÎTó|′e,Ôò½óêÕê§°ü
}
return res;
}
main.c
while(1)
{
if(sim900a_send_cmd(p,"OK",1000)==0)
{
aa++;
sprintf((char*)ADD,"%d",aa);
OLED_ShowStr(62,2,ADD,2);
}
}
给sim900a发at,返回ok就让oled显示的数加1,但为啥就是没反应呢?
|
|