#include "usart2.h" #include "at_host.h" #include "string.h" #include "rtthread.h" #include "stdlib.h" typedef struct{ void *data; int size; int type;// 0:set;1,get int cmd; }send_pkt_def; static uint8_t g_send_buff[CMD_AT_MAXLEN]={0}; static rt_event_t g_recv_event; static send_pkt_def g_pkt; static int at_puts_data(uint8_t *data,int len) { for (int i=0;i0) { if (*src<0xf0) { *dsc=*src; dsc++; src++; len--; } else { *dsc=src[0]+src[1]; dsc++; src+=2; len-=2; } } return dsc-dat; } //转义,输出转义后的数据长度 static int escaped(uint8_t *src,uint8_t *dsc,int src_len) { uint8_t *dsc_t=dsc; while(src_len--) { if (*src<0xf0) { *dsc=*src; dsc++; src++; } else { *dsc=0xf0; dsc++; *dsc=*src-0xf0; dsc++; src++; } } return dsc-dsc_t; } /** * 找到指定字符的索引 * */ static int find_char_index (uint8_t *str,char ch,int len) { // int len=strlen(str); for (int i=0;i='0'&&par<='9') { ret=par-'0'; } if (par>='A'&&par<='F') { ret=par-'A'+10; } if (par>='a'&&par<='f') { ret=par-'a'+10; } return ret; } //把字符串转化为hex,低字节在前 int at_string_to_hex(char *str,void *hex) { char *str_s=str; uint8_t *data=hex; int index=0; uint8_t tmp=0; while (*str_s) { tmp=at_char_to_hex(*str_s); if(tmp!=0xff) { data[index>>1]|=tmp<<((index&1)?0:4); index++; } str_s++; } return index; } // 发送设置命令事件 int at_send_set_event(uint8_t cmd,void *par, int size) { if(g_recv_event) { if(g_pkt.data) free(g_pkt.data); g_pkt.data=malloc(size); memcpy(g_pkt.data,par,size); g_pkt.size=size; g_pkt.type=0; g_pkt.cmd=cmd; rt_event_send(g_recv_event,CMDAT_EVENT_USER); return 0; } else { return -1; } } // 发送获取命令事件 int at_send_get_event(uint8_t cmd,void *par, int size) { if(g_recv_event) { if(g_pkt.data) free(g_pkt.data); g_pkt.data=malloc(size); memcpy(g_pkt.data,par,size); g_pkt.size=size; g_pkt.type=1; g_pkt.cmd=cmd; rt_event_send(g_recv_event,CMDAT_EVENT_USER); return 0; } else { return -1; } } // 发送数据包 int at_send_packet(void) { if(g_pkt.data||g_pkt.cmd) { if(g_pkt.type==0) { return at_send_set(g_pkt.cmd,g_pkt.data,g_pkt.size); } else if(g_pkt.type==1) { return at_send_get(g_pkt.cmd,g_pkt.data,g_pkt.size); } } return -1; } // 获取事件 int at_get_event(void) { rt_uint32_t ev; if(g_recv_event) { if(rt_event_recv(g_recv_event,0xffffffff,RT_EVENT_FLAG_OR|RT_EVENT_FLAG_CLEAR,RT_WAITING_FOREVER,&ev)==RT_EOK) return ev; else return 0; } return 0; } // 发送用户事件 int at_send_user_event(uint32_t ev) { if(g_recv_event) { rt_event_send(g_recv_event,ev); return 0; } else return -1; }