uart_pt.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  1. /*
  2. * @Description:
  3. * @Version: 2.0
  4. * @Author: Seven
  5. * @Date: 2023-06-06 14:19:14
  6. * @LastEditors: Seven
  7. * @LastEditTime: 2023-06-08 09:22:45
  8. */
  9. #include "uart_pt.h"
  10. #include "includes.h"
  11. #if 1
  12. PtTest g_ptTest;
  13. char sendbuff[320] = {0};
  14. char pt_rtbuf[320] = {0};
  15. void pt_return_handle(uint32_t uartid, char *data)
  16. {
  17. memset(pt_rtbuf,0,sizeof(pt_rtbuf));
  18. strcpy(pt_rtbuf,data);
  19. usart_tx_dma_send(uartid,(uint8_t *)pt_rtbuf,strlen(pt_rtbuf));
  20. }
  21. void gw_net_send_02(char *data, char *send_buf, uint16_t len, uint16_t *llen)
  22. {
  23. int i;
  24. // char send_buf[32];
  25. char value = 0;
  26. int send_len=0;
  27. const uint16_t len1 = len;
  28. // memset(send_buf,0,sizeof(send_buf));
  29. for(i = 0;i < len1;i++) {
  30. value = data[i];
  31. send_len += snprintf((char *)send_buf + send_len, sizeof(send_buf), "%02x", value);
  32. }
  33. *llen = send_len;
  34. // return &(send_buf[0]);
  35. }
  36. void uart_cmd_task(uint32_t uartid, char *data, uint16_t len)
  37. {
  38. char * p_data = NULL;
  39. int i = 0, j = 0, flag = 0;
  40. int n = 0, len1 = 0;
  41. uint8_t temp1 = 0, temp2 = 0;
  42. uint16_t len2;
  43. uint32_t addr,len11;
  44. uint32_t device_sn; //设备sn
  45. uint32_t device_type; //设备类型
  46. uint32_t manufactures; //产品制造商
  47. uint32_t batch_number; //批次号
  48. uint32_t production_data; //出厂日期
  49. uint32_t pcb_ver; //PCB版本
  50. char tempbuff[128] = {0};
  51. char type[4] = {0};
  52. char ssn[11] = {0};
  53. char pcbVr[3] = {0};
  54. char bn[5] = {0};
  55. char mfrs[5] = {0};
  56. char pd[9] = {0};
  57. char port[6] = {0};
  58. char user01[8] = {0};
  59. char password[16] = {0};
  60. if(strstr(data,"AT+PTMOD=ON\r\n")){ // 产测开始指令
  61. g_ptTest.bTestStart = PT_ON;
  62. pt_return_handle(uartid,"+PTMOD:ON,00000001\r\n");
  63. timeout_setValue(&g_ptTest.tt_pt_time,PT_TIME,1);//打开产测定时
  64. }
  65. else if(strstr(data,"AT+PTMOD=OFF\r\n"))//关闭产测指令
  66. {
  67. g_ptTest.bTestStart = PT_OFF;
  68. pt_return_handle(uartid,"+PTMOD:OFF,00000001\r\n");
  69. timeout_stop(&g_ptTest.tt_pt_time);//关闭产测定时
  70. delay_ms(100);
  71. NVIC_SystemReset();
  72. }
  73. else if(strstr(data,"AT+PTMOD\r\n"))
  74. {// 查询当前是否在产测模式下 产测版本
  75. if(g_ptTest.bTestStart==PT_ON)
  76. {
  77. pt_return_handle(uartid,"+PTMOD:ON,00000001\r\n");
  78. }
  79. else
  80. {
  81. pt_return_handle(uartid,"+PTMOD:OFF,00000001\r\n");
  82. }
  83. }
  84. if(g_ptTest.bTestStart == PT_ON)//打开产测后
  85. {
  86. if(strstr(data,"AT+INITDEVINFO=WBJW,"))// 初始化信息 设备类型 sn 批次号 生产厂商 生产日期
  87. {
  88. p_data = strstr(data,"AT+INITDEVINFO=WBJW,");
  89. if(strstr(p_data,"\r\n"))
  90. {
  91. sscanf(p_data,"AT+INITDEVINFO=WBJW,%[^\r\n]\r\n",tempbuff);
  92. sscanf((char*)tempbuff,"%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%s",type,ssn,pcbVr,bn,mfrs,pd,tempbuff,port,sendbuff);
  93. }
  94. i = 0; flag = 0; j=0;
  95. do{
  96. if(sendbuff[i]!=',' ){
  97. if(flag==0){
  98. user01[i] = sendbuff[i];
  99. }
  100. else if(flag==1){
  101. password[j ] = sendbuff[i];
  102. j++;
  103. }
  104. }
  105. else {
  106. if(flag==0) flag = 1;
  107. }
  108. i++;
  109. }while(sendbuff[i]!='\0');
  110. sscanf(type,"%04X",&device_type); // 设备类型
  111. sscanf(ssn,"%010u",&device_sn); //sn
  112. sscanf(pcbVr,"%02X",&pcb_ver); //PCB版本
  113. sscanf(bn,"%04X",&batch_number); //批次号
  114. sscanf(mfrs,"%04X",&manufactures); //生产厂商
  115. sscanf(pd,"%08X",&production_data); // 生产日期
  116. if(device_type != DEV_TYPE)
  117. {
  118. pt_return_handle(uartid,"+INITDEVINFO:ERR,Device_mismatch\r\n");
  119. return;
  120. }
  121. g_firmwareMsg.gatewayMsg.hardwareMsg.firstPowerUp = 0x5A5A;
  122. g_firmwareMsg.gatewayMsg.hardwareMsg.eepromVer = 1;
  123. g_firmwareMsg.gatewayMsg.hardwareMsg.bInit = 1;
  124. g_firmwareMsg.gatewayMsg.hardwareMsg.devicType = device_type;
  125. g_firmwareMsg.gatewayMsg.hardwareMsg.device_sn = device_sn;
  126. g_firmwareMsg.gatewayMsg.hardwareMsg.factoryMsg = manufactures;
  127. g_firmwareMsg.gatewayMsg.hardwareMsg.seqNo = batch_number;
  128. g_firmwareMsg.gatewayMsg.hardwareMsg.data = production_data;
  129. g_firmwareMsg.gatewayMsg.hardwareMsg.pcbVersion = pcb_ver;
  130. // g_firmwareMsg.gatewayMsg.hardwareMsg.sqare = 0;
  131. fram_write_hardware_msg(); // 写入EEPROOM
  132. sscanf(tempbuff,"%s",g_firmwareMsg.mqttidport.ip); // mqtt 服务器地址
  133. sscanf(port,"%s",g_firmwareMsg.mqttidport.port); //mqtt 端口号
  134. sscanf(user01,"%s",g_firmwareMsg.mqttidport.admin);
  135. sscanf(password,"%s",g_firmwareMsg.mqttidport.password);
  136. g_firmwareMsg.mqttidport.flag = 1;
  137. fram_write_mqtt_msg();
  138. // fram_init_version();//写
  139. // g_firmwareMsg.gatewayMsg.verMsg.pt_version = SOFTWARE_VERSION_PT;
  140. // AT24CXX_Write(DEVICE_VERSION_INFO_ADDR+4,(uint8_t*)&g_firmwareMsg.gatewayMsg.verMsg.pt_version,sizeof(GateVersionMsg));//写产测版本
  141. pt_return_handle(uartid,"+INITDEVINFO:OK\r\n");
  142. }
  143. else if(strstr(data,"AT+DEVINFO\r\n")) // 读取信息
  144. {
  145. fram_read_hardware_msg();
  146. fram_read_mqtt_msg();
  147. // fram_read_version();
  148. memset(sendbuff,0,sizeof(sendbuff));
  149. strcpy(sendbuff,"+DEVINFO:"); // 文件头
  150. memset(tempbuff,0,sizeof(tempbuff));
  151. sprintf(tempbuff,"%04x,%010u,%02x,%04x,",g_firmwareMsg.gatewayMsg.hardwareMsg.devicType,\
  152. g_firmwareMsg.gatewayMsg.hardwareMsg.device_sn,\
  153. g_firmwareMsg.gatewayMsg.hardwareMsg.pcbVersion,g_firmwareMsg.gatewayMsg.devicTypeID);
  154. strcat(sendbuff,tempbuff);
  155. memset(tempbuff,0,sizeof(tempbuff));
  156. gw_net_send_02((char*)g_firmwareMsg.gatewayMsg.Uuid,(char*)tempbuff,12,&len2);
  157. strcat(sendbuff,tempbuff);
  158. strcat(sendbuff,",");
  159. // memset(tempbuff,0,sizeof(tempbuff));
  160. // strncpy(tempbuff,(char*)g_firmwareMsg.gatewayMsg.Imei,15);
  161. // strcat(sendbuff,tempbuff);
  162. memset(tempbuff,0,sizeof(tempbuff));
  163. sprintf(tempbuff,",%08x,%08x,%04x,%04x,%08x",g_firmwareMsg.gatewayMsg.verMsg.bootloaderVr,\
  164. g_firmwareMsg.gatewayMsg.verMsg.appVr,g_firmwareMsg.gatewayMsg.hardwareMsg.seqNo,\
  165. g_firmwareMsg.gatewayMsg.hardwareMsg.factoryMsg,g_firmwareMsg.gatewayMsg.hardwareMsg.data);
  166. strcat(sendbuff,tempbuff);
  167. memset(tempbuff,0,sizeof(tempbuff));
  168. sprintf(tempbuff,",%s,%s,%s,%s",g_firmwareMsg.mqttidport.ip,g_firmwareMsg.mqttidport.port, \
  169. g_firmwareMsg.mqttidport.admin,g_firmwareMsg.mqttidport.password);
  170. strcat(sendbuff,tempbuff);
  171. len1 = strlen(sendbuff);
  172. sendbuff[len1] = 0x0D;
  173. sendbuff[len1+1] = 0x0A;
  174. // usart_tx_dma_send(uartid,(uint8_t *)sendbuff,strlen(sendbuff));
  175. pt_return_handle(uartid,sendbuff);
  176. }
  177. else if(strstr(data,"AT+EEPROMERASE=")){ // 擦除EEPROM
  178. p_data = strstr(data,"AT+EEPROMERASE=");
  179. if(strstr(p_data,"\r\n")){
  180. memset(type,0,sizeof(type));
  181. sscanf(p_data,"AT+EEPROMERASE=%[^\r\n]\r\n",type);
  182. sscanf(type,"%04X",&device_type); // 设备类型
  183. if(device_type!=DEV_TYPE){
  184. pt_return_handle(uartid,"+EEPROMERASE:ERR,Device_mismatch\r\n");
  185. memset(data,0,len);
  186. return;
  187. }
  188. fram_init();
  189. pt_return_handle(uartid,"+EEPROMERASE:OK\r\n");
  190. }
  191. }
  192. else if(strstr((char*)data,"AT+EEPROMWR=")) { // EEPROM 写
  193. p_data = strstr((char*)data,"AT+EEPROMWR=");
  194. if(strstr(p_data,"\r\n")){
  195. memset(type,0,sizeof(type));
  196. memset(mfrs,0,sizeof(mfrs));
  197. memset(bn,0,sizeof(bn));
  198. memset(tempbuff,0,sizeof(tempbuff));
  199. sscanf(p_data,"AT+EEPROMWR=%[^\r\n]\r\n",tempbuff);
  200. sscanf(tempbuff,"%[^,],%[^,],%[^,],%[^,]",bn,type,mfrs,tempbuff);
  201. sscanf(type,"%04x",&addr); //地址
  202. sscanf(mfrs,"%04x",&len11); // 长度
  203. sscanf(bn,"%04X",&device_type); // 设备类型
  204. if(device_type!=DEV_TYPE){
  205. pt_return_handle(uartid,"+EEPROMWR:ERR,Device_mismatch\r\n");
  206. return;
  207. }
  208. len1 = 0;
  209. for(i = 0; i < len11*2; i+=2)
  210. {
  211. temp1 = HexToChar(tempbuff[i]);
  212. temp2 = HexToChar(tempbuff[i+1]);
  213. sendbuff[len1] = (temp1<<4) | temp2;
  214. len1++;
  215. }
  216. AT24CXX_Write(addr,(uint8_t*)sendbuff,len11);
  217. pt_return_handle(uartid,"+EEPROMWR:OK\r\n");
  218. }
  219. }
  220. else if(strstr((char*)data,"AT+EEPROMRD=")){ // EEPROM 读取
  221. p_data = strstr((char*)data,"AT+EEPROMRD=");
  222. if(strstr(p_data,"\r\n")){
  223. memset(type,0,sizeof(type));
  224. memset(mfrs,0,sizeof(type));
  225. memset(tempbuff,0,sizeof(tempbuff));
  226. sscanf(p_data,"AT+EEPROMRD=%[^\r\n]\r\n",tempbuff);
  227. sscanf(tempbuff,"%[^,],%[^,]",type,mfrs);
  228. sscanf(type,"%04x",&addr); //地址
  229. sscanf(mfrs,"%04x",&len11); //长度
  230. AT24CXX_Read(addr,(uint8_t *)tempbuff,len11);
  231. memset(sendbuff,0,sizeof(sendbuff));
  232. sprintf(sendbuff,"+EEPROMRD:%04x,",len11);
  233. n = 15;
  234. for(i=0;i<len11;i++){
  235. len1 += snprintf((char *)sendbuff + n + len1, sizeof(sendbuff), "%02x", tempbuff[i]);
  236. }
  237. pt_return_handle(uartid,sendbuff);
  238. }
  239. }
  240. else if(strstr((char*)data,"AT+MQTTWR=WBJW,")) { // MQTT信息写入
  241. p_data = strstr((char*)data,"AT+MQTTWR=WBJW,");
  242. if(strstr(p_data,"\r\n")){
  243. memset(tempbuff,0,sizeof(tempbuff));
  244. memset(port,0,sizeof(port));
  245. memset(user01,0,sizeof(user01));
  246. memset(password,0,sizeof(password));
  247. sscanf(p_data,"AT+MQTTWR=WBJW,%[^,],%[^,],%[^,],%s",tempbuff,port,user01,password);
  248. fram_init_mqtt_msg();
  249. sscanf(tempbuff,"%s",g_firmwareMsg.mqttidport.ip); // mqtt 服务器地址
  250. sscanf(port,"%s",g_firmwareMsg.mqttidport.port); //mqtt 端口号
  251. sscanf(user01,"%s",g_firmwareMsg.mqttidport.admin);
  252. sscanf(password,"%s",g_firmwareMsg.mqttidport.password);
  253. g_firmwareMsg.mqttidport.flag = 1;
  254. fram_write_mqtt_msg();
  255. pt_return_handle(uartid,"+MQTTWR:OK\r\n");
  256. }
  257. }
  258. else if(strstr((char*)data,"AT+MQTTRD\r\n")) { // mqtt 信息读取
  259. p_data = strstr((char*)data,"AT+MQTTRD\r\n");
  260. fram_read_mqtt_msg();
  261. memset(sendbuff,0,sizeof(sendbuff));
  262. strcpy(sendbuff,"+MQTTRD:"); // 文件头
  263. memset(tempbuff,0,sizeof(tempbuff));
  264. sprintf(tempbuff,"%s,%s,%s,%s",g_firmwareMsg.mqttidport.ip,g_firmwareMsg.mqttidport.port, \
  265. g_firmwareMsg.mqttidport.admin,g_firmwareMsg.mqttidport.password);
  266. strcat(sendbuff,tempbuff);
  267. len1 = strlen(sendbuff);
  268. sendbuff[len1] = 0x0D;
  269. sendbuff[len1+1] = 0x0A;
  270. pt_return_handle(uartid,sendbuff);
  271. }
  272. else if(strstr((char*)data,"AT+RST\r\n")) { //复位
  273. pt_return_handle(uartid,"+RST:OK\r\n");
  274. delay_ms(100);//延时100ms
  275. NVIC_SystemReset();//复位
  276. }
  277. }
  278. }
  279. uint8_t PT_RCVBuf[256];
  280. uint16_t PT_RCVLen;
  281. //产测处理
  282. void pt_cmd_task(void)
  283. {
  284. if(!Check_Seqeue_Empty(uart0_rx_sq))
  285. {
  286. PT_RCVLen=0;
  287. memset(PT_RCVBuf,0,sizeof(PT_RCVBuf));
  288. De_Queue(uart0_rx_sq,PT_RCVBuf,sizeof(PT_RCVBuf),&PT_RCVLen);
  289. // printf("rcv len:%u\n",PT_RCVLen);
  290. // data_dump("uart1 rcv",PT_RCVBuf,PT_RCVLen);
  291. // uart_cmd_task((char *)Rcv_Buf,lout);
  292. uart_cmd_task(USART0,(char *)PT_RCVBuf,PT_RCVLen);
  293. }
  294. else if(!Check_Seqeue_Empty(uart3_rx_sq))
  295. {
  296. PT_RCVLen=0;
  297. memset(PT_RCVBuf,0,sizeof(PT_RCVBuf));
  298. De_Queue(uart3_rx_sq,PT_RCVBuf,sizeof(PT_RCVBuf),&PT_RCVLen);
  299. // printf("rcv len:%u\n",PT_RCVLen);
  300. // data_dump("uart1 rcv",PT_RCVBuf,PT_RCVLen);
  301. uart_cmd_task(RS485_USARTx,(char *)PT_RCVBuf,PT_RCVLen);
  302. }
  303. if(timeout_isOut(&g_ptTest.tt_pt_time))
  304. {
  305. NVIC_SystemReset();
  306. }
  307. }
  308. #endif