usart DMA 发送AT命令

FBIIIII 2017-10-26 09:22:59
大神们 发送AT命令的时候+++可以收到回复ok 但是发送AT+PID? 这种 就不行 帮帮看看

static at_cmd s_zigbee_init_cmd [] = {

{"+++","OK",3, 2},
{"+++","OK",3, 2},
{"+++","OK",3, 2},
{"+++","OK",3, 2},
{"AT+PRF=0","OK",8,2},
{"AT+VER","OK",6, 2},
};

void zigbee_task(void *p_arg)
{
zigbee_msg_st ltv_Msg;
unsigned char lcv_BuffIndex;
unsigned char *lcp_RecvPtr;
unsigned char *lcp_SendPtr;
unsigned char i;

uint8_t atcmdindex = 0;
/*zigbee初始化*/
zigbee_usart1_init();

/*创建消息队列*/
gtv_ZigbeeTaskMsgQueueHandle = xQueueCreate(10, sizeof(zigbee_msg_st));
configASSERT(gtv_ZigbeeTaskMsgQueueHandle != NULL);

while(1) {
lcv_BuffIndex = bsp_get_usart1_send_buff_index();
if(lcv_BuffIndex) {
lcp_SendPtr = gcav_Usart1DmaTxBuffer[1];
} else {
lcp_SendPtr = gcav_Usart1DmaTxBuffer[0];
}

for(i=0; i<s_zigbee_init_cmd[atcmdindex].mcv_AtCmdLen; i++) {
/**拷贝数据**/
lcp_SendPtr[i] = s_zigbee_init_cmd[atcmdindex].mcv_AtCmdBuff[i];
}
/**发送函数**/
usart1_send_buffer(NULL,s_zigbee_init_cmd[atcmdindex].mcv_AtCmdLen);

/*等待串口消息*/
xQueueReceive(gtv_ZigbeeTaskMsgQueueHandle, <v_Msg, portMAX_DELAY);

if(ltv_Msg.mcv_RxIndex) {
lcp_RecvPtr = gcav_Usart1DmaRxBuffer[1];
} else {
lcp_RecvPtr = gcav_Usart1DmaRxBuffer[0];
}

do {
if((lcp_RecvPtr[0] == 0x0D) && (lcp_RecvPtr[1] == 0x0A)) {
lcp_RecvPtr = &lcp_RecvPtr[2];
} else {
break;
}
} while(1);
/*接收和结构体比较*/
for(i=0; i<s_zigbee_init_cmd[atcmdindex].mcv_RecvLen; i++) {
if(lcp_RecvPtr[i] != s_zigbee_init_cmd[atcmdindex].mcv_RespBuff[i]) {
break;
}
}

if(i >= s_zigbee_init_cmd[atcmdindex].mcv_RecvLen) {
if(atcmdindex+1 < sizeof(s_zigbee_init_cmd)/sizeof(at_cmd)) {
atcmdindex++;
} else {
atcmdindex = 0;//重新发送
}
} else {

}
}
}
...全文
572 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
91program 2017-10-27
  • 打赏
  • 举报
回复
LZ,你有没有用超级终端,或者其它串口工具试一个发送 AT+PID? 有没有回应?以确定是你程序的原因,还是其它原因。 没有回应的可能情况: 1)发送没有完成,如没有发送回车换行 2)有回应,但不是 OK,而是 Error 或者其它
FBIIIII 2017-10-27
  • 打赏
  • 举报
回复
顶一下
简单明了 oid 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;} } }

19,500

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧