我用USART2和sim900连接,接线没有问题,现在的情况是,我在测试其功能时发送"ATE1",只是返回了"ATE1",正常值应该返回"ATE1 OK ",我给出主要代码,大家帮我看看
我的USART3连接GPS , USART2连接sim900, USART1连接上位机
如下是串口的中断部分:
[mw_shl_code=c,true]void NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure;
NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn; //通道设置为串口3中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断响应先占式优先级为2
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2; //中断响应从优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn; //通道设置为串口2中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1; //中断响应先占式优先级为1
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0; //中断响应从优先级0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
NVIC_InitStructure.NVIC_IRQChannel = WWDG_IRQn; //使能窗口定时器中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占式优先级为0
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}[/mw_shl_code]
USART2的中断程序
[mw_shl_code=c,true]void USART2_IRQHandler(void)
{
u8 i,j,k = 0;
if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)//判断是否是接收中断
{
//USART_ClearITPendingBit(USART2,USART_IT_RXNE);//清除接收中断位
GsmRcv[GsmRcvCnt] = USART_ReceiveData(USART2);
GsmRcvCnt++;
//j = strlen(GsmRcv);
//delay_nms(50);
//k = strlen(GsmRcv);
printf("已进入串口2中断");
if(GsmRcvCnt >= 99)
{
GsmRcvCnt = 0;
}
if(GsmRcv[GsmRcvCnt-1] == 0x0A && GsmRcv[GsmRcvCnt-2] == 0x0D && GsmRcvCnt >=2 )
{
printf("接收完毕");
USART_ITConfig(USART2,USART_IT_RXNE,DISABLE); //关闭USART2接收中断
gsm_num = GsmRcvCnt;
printf("给gsm_num赋值");
GsmRcvCnt = 0;
GsmAtFlag = 1;
i = 0;
while(GsmRcv != 0)
{
gsm_datas = GsmRcv;
GsmRcv = 0;
i++;
printf("gsm_datas已有数据");
}
printf("gsm_num: %d\n",strlen(gsm_datas));
for(i=0;i<99;i++)
{
printf("%c",gsm_datas);
}
//USART_ITConfig(USART2,USART_IT_RXNE,ENABLE);
}
}
}
[/mw_shl_code]
[mw_shl_code=c,true]u8 GPRSConnect(void)
{
u8 err=0;
printf("进入GPRS");
SendAT("ATE1",4);
printf("已发送ate1");
err=WaitForStr("OK",2,2); //ATE1 OK
printf("已发送AT");
if(err == 0)
{
printf("ATE1 OK");
}
if(err>0)
return err;
return err;
}
[/mw_shl_code]
[mw_shl_code=c,true]//发送AT指令
void SendAT(u8 *dat,u16 num)
{
USART2_Write(dat,num);
USART2_SendByte(0x0D);
USART2_SendByte(0x0A);
}[/mw_shl_code]
|