uart_conf333.c 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399
  1. #include "uart_conf.h"
  2. #include "includes.h"
  3. #include "BSP.h"
  4. #include "AT24c128.h"
  5. #include "net_proc.h"
  6. #include "lora.h"
  7. #include "ota.h"
  8. PtTest g_ptTest;
  9. char *answer[] = {
  10. "+PTMOD:ON,00000001\r\n",//0
  11. "+PTMOD:ON,00000001\r\n",//1
  12. "+PTMOD:OFF,00000001\r\n",//2
  13. "+INITDEVINFO:OK\r\n",//3
  14. "+INITDEVINFO:ERR,DEVICE_TYPE_MISMATCH\r\n",//4
  15. "+EEPROMERASE:OK\r\n",//5
  16. "+EEPROMERASE:ERR,DEVICE_TYPE_MISMATCH\r\n",//6
  17. "+RST:OK\r\n",//7
  18. "+EEPROMWR:OK\r\n",//8
  19. "+EEPROMWR:ERR\r\n",//9
  20. "+INITLORAPARAINDEX:OK\r\n",//10
  21. "+INITLORAPARAINDEX:ERR\r\n",//11
  22. "+OFFLINE:OK\r\n",//12
  23. "+OFFLINE:ERR\r\n",//13
  24. };
  25. char Send_Buf_Char[320];
  26. char *gw_net_send_02(char *data, uint16_t len, uint16_t *llen)
  27. {
  28. int i;
  29. //char send_buf[320];
  30. char value = 0;
  31. int send_len=0;
  32. const uint16_t len1 = len;
  33. memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
  34. for(i = 0;i < len1;i++) {
  35. value = data[i];
  36. send_len += snprintf((char *)Send_Buf_Char + send_len, sizeof(Send_Buf_Char), "%02x", value);
  37. }
  38. *llen = send_len;
  39. return &(Send_Buf_Char[0]);
  40. }
  41. extern uint8_t rcv_buf_pt[256];
  42. char sendbuff[320] = {0};
  43. uint8_t eeprom_buf[64] = {0};
  44. uint32_t eeprom_addr=0;
  45. #define EEPROM_PAGE 256
  46. #define EEPROM_BUF_LEN 64
  47. void uart_cmd_task(uint8_t *data, uint8_t len)
  48. {
  49. OS_ERR err;
  50. uint16_t eeprom_first = 0;
  51. int i = 0;
  52. int result = 0;
  53. int len1 = 0;
  54. uint16_t len11;
  55. unsigned int lora_index;
  56. uint32_t device_id; //设备sn
  57. uint32_t device_type; //设备类型
  58. uint32_t manufactures; //产品制造商
  59. uint32_t batch_number; //批次号
  60. uint32_t production_data; //出厂日期
  61. uint32_t pcb_ver; //PCB版本
  62. char tempbuff[130] = {0};
  63. char type[5] = {0};
  64. char ssn[11] = {0};
  65. char pcb[3] = {0};
  66. char bn[5] = {0};
  67. char mfrs[5] = {0};
  68. char pd[9] = {0};
  69. char port[6] = {0};
  70. char usr[40] = {0};
  71. char pwd[40] = {0};
  72. //eeprom
  73. char eepaddr[5] = {0};
  74. char eeplen[5] = {0};
  75. uint32_t eep_addr = 0;
  76. uint32_t eep_len = 0;
  77. uint16_t eep_len_temp = 0;
  78. char * p_data = NULL;
  79. //测试离线升级
  80. char master_snb[15] = {0};
  81. char slave_snb[15] = {0};
  82. char des_snb[15] = {0};
  83. unsigned int master_sn = 0;
  84. unsigned int slave_sn = 0;
  85. unsigned int des_sn = 0;
  86. if(0 == strncmp((char*)data,"AT+PTMOD=ON\r\n",len)){ // 产测开始指令
  87. g_ptTest.bTestStart = PT_ON;
  88. uart_msg_send(UART1_ID, (char *)answer[0], strlen(answer[0]));
  89. device_fixed_info.Work_State = DEV_WORK_STATE_PT;
  90. //关闭所有灯
  91. close_all_led();
  92. // if(hd_id == PCB_V1)//关闭编码器中断
  93. {
  94. encoder_irq_set(DISABLE);
  95. }
  96. }
  97. else if(strstr((char*)data,"AT+PTMOD\r\n")){ // 查询当前是否在产测模式下 产测版本
  98. if(g_ptTest.bTestStart==PT_ON) uart_msg_send(UART1_ID, (char *)answer[1], strlen(answer[1]));
  99. else uart_msg_send(UART1_ID, (char *)answer[2], strlen(answer[2]));
  100. }
  101. if(g_ptTest.bTestStart == PT_ON)
  102. {
  103. if(0 == strncmp((char*)data,"AT+PTMOD=OFF\r\n",len)){ //产测结束指令
  104. g_ptTest.bTestStart = PT_OFF;
  105. uart_msg_send(UART1_ID, (char *)answer[2], strlen(answer[2]));
  106. if(device_info.alrd == DEVICE_ALRD)//已初始化
  107. {
  108. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  109. }
  110. else
  111. {
  112. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  113. //未初始化时,将设备sn置为0xffffffff;设备类型是默认的
  114. device_info.device_id = 0xffffffff;
  115. device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16;
  116. }
  117. // if(hd_id == PCB_V1)//打开编码器中断
  118. {
  119. encoder_irq_set(ENABLE);
  120. }
  121. }
  122. else if(strstr((char*)data,"AT+INITDEVINFO=WBJW,")){ // 初始化信息 设备类型 sn 批次号 生产厂商 生产日期
  123. p_data=strstr((char*)data,"AT+INITDEVINFO=WBJW,");
  124. if(strstr(p_data,"\r\n"))
  125. {
  126. result = sscanf((char*)p_data,"AT+INITDEVINFO=WBJW,%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,]\r\n",type,ssn,pcb,bn,mfrs,pd,tempbuff,port,usr,pwd);
  127. sscanf(type,"%04X",&device_type); // 设备类型
  128. sscanf(ssn,"%010u",&device_id); //sn
  129. sscanf(pcb,"%02X",&pcb_ver); //PCB版本
  130. sscanf(bn,"%04X",&batch_number); //批次号
  131. sscanf(mfrs,"%04X",&manufactures); //生产厂商
  132. sscanf(pd,"%08X",&production_data); // 生产日期
  133. if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
  134. {
  135. uart_msg_send(UART1_ID, (char *)answer[4], strlen(answer[4]));
  136. memset(&rcv_buf_pt,0,sizeof(rcv_buf_pt));
  137. return;
  138. }
  139. device_info.alrd = DEVICE_ALRD;
  140. device_info.device_type = device_type;
  141. device_info.device_id = device_id;
  142. device_info.batch_number = batch_number;
  143. device_info.manufactures = manufactures;
  144. device_info.production_data = production_data;
  145. device_info.pcb_ver = pcb_ver;
  146. device_info_update();//写eeprom
  147. eeprom_first = EEPROM_FIRST_INIT_FLAG;
  148. AT24CXX_Write(EECFG_FIRST_INIT0, (uint8_t *)&eeprom_first, 2);
  149. uart_msg_send(UART1_ID, (char *)answer[3], strlen(answer[3]));
  150. }
  151. }
  152. else if(0 == strncmp((char*)data,"AT+DEVINFO\r\n",len)){ // 读取信息
  153. device_info_get();//读取eeprom中的设备信息
  154. memset(sendbuff,0,sizeof(sendbuff));
  155. strcpy(sendbuff,"+DEVINFO:"); // 文件头
  156. memset(tempbuff,0,sizeof(tempbuff));
  157. sprintf(tempbuff,"%04x,%010u,%02x,%04x,",device_info.device_type,\
  158. device_info.device_id,\
  159. device_info.pcb_ver,device_fixed_info.MCU_Type_ID);
  160. strcat(sendbuff,tempbuff);
  161. gw_net_send_02((char*)device_fixed_info.MCU_UUID,12,&len11);
  162. memset(tempbuff,0,sizeof(tempbuff));
  163. memcpy(tempbuff,Send_Buf_Char,len11);
  164. strcat(sendbuff,tempbuff);
  165. strcat(sendbuff,",");
  166. memset(tempbuff,0,sizeof(tempbuff));
  167. sprintf(tempbuff,"%s,%08x,%08x,%04x,%04x,%08x,,,,","", device_fixed_info.Soft_ver_boot,\
  168. device_fixed_info.Soft_ver_app,device_info.batch_number,\
  169. device_info.manufactures,device_info.production_data);
  170. strcat(sendbuff,tempbuff);
  171. len1 = strlen(sendbuff);
  172. sendbuff[len1] = 0x0D;
  173. sendbuff[len1+1] = 0x0A;
  174. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  175. }
  176. else if(strstr((char*)data,"AT+EEPROMERASE="))//擦除整片eeprom
  177. {
  178. p_data = strstr((char*)data,"AT+EEPROMERASE=");
  179. if(strstr(p_data,"\r\n"))
  180. {
  181. result = sscanf((char*)p_data,"AT+EEPROMERASE=%[^,]\r\n",type);
  182. sscanf(type,"%04X",&device_type); // 设备类型
  183. if(device_type_cmp(SOFTWARE_VERSION_APP,(u16)device_type) == 0)
  184. {
  185. uart_msg_send(UART1_ID, (char *)answer[6], strlen(answer[6]));
  186. memset(&rcv_buf_pt,0,sizeof(rcv_buf_pt));
  187. return;
  188. }
  189. eeprom_addr = 0;
  190. memset(eeprom_buf,0,EEPROM_BUF_LEN);
  191. for(i = 0; i < EEPROM_PAGE; i++)
  192. {
  193. AT24CXX_Write(eeprom_addr, eeprom_buf, EEPROM_BUF_LEN);
  194. eeprom_addr += EEPROM_BUF_LEN;
  195. }
  196. uart_msg_send(UART1_ID, (char *)answer[5], strlen(answer[5]));
  197. //清除接收数据FIFO
  198. uart_blocking_read((char *)tempbuff, UART_DEBUG, 1);
  199. }
  200. }
  201. else if(strstr((char*)data,"AT+RST\r\n"))//复位
  202. {
  203. uart_msg_send(UART1_ID, (char *)answer[7], strlen(answer[7]));
  204. OSTimeDlyHMSM(0, 0, 0, 100, OS_OPT_TIME_DLY, &err);
  205. NVIC_SystemReset();
  206. }
  207. else if(strstr((char*)data,"AT+EEPROMWR="))//测外部eeprom写
  208. {
  209. p_data=strstr((char*)data,"AT+EEPROMWR=");
  210. if(strstr(p_data,"\r\n"))
  211. {
  212. memset(tempbuff,0,sizeof(tempbuff));
  213. result = sscanf((char*)p_data,"AT+EEPROMWR=%[^,],%[^,],%[^,]\r\n",eepaddr,eeplen,tempbuff);
  214. sscanf(eepaddr,"%04X",&eep_addr); //地址
  215. sscanf(eeplen,"%04X",&eep_len); //长度
  216. eep_len_temp = asciitohex(tempbuff,eeprom_buf,strlen(tempbuff)-2);
  217. if(eep_len == eep_len_temp) //OK
  218. {
  219. AT24CXX_Write(eep_addr,(uint8_t *)eeprom_buf,eep_len);
  220. uart_msg_send(UART1_ID, (char *)answer[8], strlen(answer[8]));
  221. }
  222. else//ERR
  223. {
  224. uart_msg_send(UART1_ID, (char *)answer[9], strlen(answer[9]));
  225. }
  226. }
  227. }
  228. else if(strstr((char*)data,"AT+EEPROMRD="))//测外部eeprom读
  229. {
  230. p_data=strstr((char*)data,"AT+EEPROMRD=");
  231. if(strstr(p_data,"\r\n"))
  232. {
  233. result = sscanf((char*)p_data,"AT+EEPROMRD=%[^,],%[^,]\r\n",eepaddr,eeplen);
  234. sscanf(eepaddr,"%04X",&eep_addr); //地址
  235. sscanf(eeplen,"%04X",&eep_len); //长度
  236. AT24CXX_Read(eep_addr,eeprom_buf,eep_len);
  237. memset(Send_Buf_Char,0,sizeof(Send_Buf_Char));
  238. gw_net_send_02((char*)eeprom_buf,eep_len,&len11);
  239. memset(sendbuff,0,sizeof(sendbuff));
  240. strcpy(sendbuff,"+EEPROMRD:"); // 文件头
  241. memset(tempbuff,0,sizeof(tempbuff));
  242. len11 = sprintf(tempbuff,"%04x,%04x,",eep_addr,eep_len);
  243. strcat(sendbuff,tempbuff);
  244. strcat(sendbuff,Send_Buf_Char);
  245. len1 = strlen(sendbuff);
  246. sendbuff[len1] = 0x0D;
  247. sendbuff[len1+1] = 0x0A;
  248. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  249. }
  250. }
  251. else if(strstr((char*)data,"AT+INITLORAPARAINDEX=WBJW,")) //写LoRa参数当前组索引号
  252. {
  253. p_data=strstr((char*)data,"AT+INITLORAPARAINDEX=WBJW,");
  254. if(strstr(p_data,"\r\n"))
  255. {
  256. result = sscanf((char*)p_data,"AT+INITLORAPARAINDEX=WBJW,%[^,]\r\n",type);
  257. sscanf(type,"%u",&lora_index); // 设备类型
  258. if(lora_index < LORA_GROUP_MAX)//正确
  259. {
  260. eepaddr[0] = lora_index;
  261. eepaddr[1] = ~eepaddr[0];
  262. AT24CXX_Write(LORA_ADDR,(uint8_t *)eepaddr,2);
  263. uart_msg_send(UART1_ID, (char *)answer[10], strlen(answer[10]));
  264. }
  265. else
  266. {
  267. uart_msg_send(UART1_ID, (char *)answer[11], strlen(answer[11]));
  268. }
  269. }
  270. }
  271. else if(strstr((char*)data,"AT+LORAPARAINDEX\r\n")) //读LoRa参数当前组索引号
  272. {
  273. memset(sendbuff,0,sizeof(sendbuff));
  274. strcpy(sendbuff,"+LORAPARAINDEX:"); // 文件头
  275. AT24CXX_Read(LORA_ADDR,(uint8_t *)eepaddr,2);
  276. memset(tempbuff,0,sizeof(tempbuff));
  277. sprintf(tempbuff,"%u",eepaddr[0]);
  278. strcat(sendbuff,tempbuff);
  279. len1 = strlen(sendbuff);
  280. sendbuff[len1] = 0x0D;
  281. sendbuff[len1+1] = 0x0A;
  282. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  283. }
  284. else if(strstr((char*)data,"AT+ENCRYPT\r\n")) //读连接器加密状态
  285. {
  286. memset(sendbuff,0,sizeof(sendbuff));
  287. strcpy(sendbuff,"+ENCRYPT:"); // 文件头
  288. memset(tempbuff,0,sizeof(tempbuff));
  289. sprintf(tempbuff,"%u",device_fixed_info.Encrypt);
  290. strcat(sendbuff,tempbuff);
  291. len1 = strlen(sendbuff);
  292. sendbuff[len1] = 0x0D;
  293. sendbuff[len1+1] = 0x0A;
  294. uart_msg_send(UART1_ID, sendbuff, strlen(sendbuff));
  295. }
  296. else if(strstr((char*)data,"AT+OFFLINE=")) //测试。下发离线升级指令
  297. {
  298. p_data=strstr((char*)data,"AT+OFFLINE=");
  299. if(strstr(p_data,"\r\n"))
  300. {
  301. result = sscanf((char*)p_data,"AT+OFFLINE=%[^,],%[^,],%[^,]\r\n",master_snb,slave_snb,des_snb);
  302. sscanf(master_snb,"%u",&master_sn);
  303. sscanf(slave_snb,"%u",&slave_sn);
  304. sscanf(des_snb,"%u",&des_sn);
  305. if(slave_sn != des_sn)//失败
  306. {
  307. uart_msg_send(UART1_ID, (char *)answer[13], strlen(answer[13]));
  308. printf("slave sn:%010u, des sn:%010u\n",slave_sn,des_sn);
  309. }
  310. else //成功
  311. {
  312. uart_msg_send(UART1_ID, (char *)answer[12], strlen(answer[12]));
  313. //退出产测
  314. g_ptTest.bTestStart = PT_OFF;
  315. uart_msg_send(UART1_ID, (char *)answer[2], strlen(answer[2]));
  316. if(device_info.alrd == DEVICE_ALRD)//已初始化
  317. {
  318. device_fixed_info.Work_State = DEV_WORK_STATE_NORMAL;
  319. }
  320. else
  321. {
  322. device_fixed_info.Work_State = DEV_WORK_STATE_UNINIT;
  323. //未初始化时,将设备sn置为0xffffffff;设备类型是默认的
  324. device_info.device_id = 0xffffffff;
  325. device_info.device_type = (SOFTWARE_VERSION_APP&0xffff0000)>>16;
  326. }
  327. //Lora发送命令
  328. lora_offline_update(master_sn,slave_sn,des_sn);
  329. }
  330. }
  331. }
  332. }
  333. memset(&rcv_buf_pt,0,sizeof(rcv_buf_pt));
  334. }