| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254 |
- /*
- * uart_rcv.c
- *
- * Created on: 2022年4月20日
- * Author: dell
- */
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include "onechip_include_header.h"
- #define ENV_ADJ_THRESHOLD 27.0
- #define QR_RESEND_3s 300
- #define DEBUG_BUF_SIZE (512) // 调试串口缓冲区长度
- #define BUF_SIZE (512) // 调试串口缓冲区长度
- enum SLAVE_MCU_Ctr_cmd_type
- {
- SLAVE_MCU_CMD_PARAM = 0x01,
- SLAVE_MCU_CMD_HEAT = 0x02,
- SLAVE_MCU_CMD_LIGHT_CTR= 0X03,
- SLAVE_MCU_CMD_QRSCANNER_CTR= 0X04,
- SLAVE_MCU_CMD_FAN= 0X05,
- SLAVE_MCU_CMD_CARD_ST= 0X06,
- SLAVE_MCU_CMD_PID = 0x20,
- };
- enum SLAVE_MCU_Ctr_UP_type
- {
- SLAVE_MCU_UP_HEAT = 0x10,
- SLAVE_MCU_UP_QR_PARAM= 0X11,
- SLAVE_MCU_UP_QR = 0x12,
- SLAVE_MCU_INFO, //异常信息
- };
- uint8_t g_uart2_rcv_start = 0;
- uint8_t g_uart2_rcv_complete_flg = 0;
- uint8_t g_uart2_rx_buf[DEBUG_BUF_SIZE] = {0};
- // uint8_t g_uart2_tx_buf[BUF_SIZE] = {0};
- uint32_t g_uart2_rx_len = 0;
- str_hole_info_t hole1 = {0};
- str_hole_info_t hole2 = {0};
- str_hole_info_t hole3 = {0};
- str_hole_info_t hole4 = {0};
- str_hole_info_t hole5 = {0};
- str_hole_info_t hole6 = {0};
- str_hole_info_t hole7 = {0};
- str_hole_info_t hole8 = {0};
- str_hole_info_t hole9 = {0};
- str_hole_info_t hole10 = {0};
- str_card_param_info_t m_str_card_param_info = {0};
- unsigned int haveheaderflag = 0;
- uint32_t qr_check_delay = QR_CHECH_STATE_FIRST; /*1s定时器里面,大于0,每s减1*/
- extern void QRparam_upload(str_card_param_info_t *p_str_card_param_info);
- extern uint8_t sys_info[40];
- uint32_t received_len;
- void svanner_receive_Rec_Start(UART_HandleTypeDef *huart){
- __HAL_UART_CLEAR_IDLEFLAG(huart);
- memset((char *)g_uart2_rx_buf,0,DEBUG_BUF_SIZE);
- received_len = 0;
- HAL_UART_Receive_DMA(huart, g_uart2_rx_buf, DEBUG_BUF_SIZE);
- __HAL_UART_ENABLE_IT(huart, UART_IT_IDLE);
- sysinf.updateQR = false;
- }
- void svanner_receive_Rec_Stop(UART_HandleTypeDef *huart){
- HAL_UART_DMAStop(huart);
- }
- /********************************************************************
- * bcd_to_hex()
- *
- *描述:BCD转HEX
- *参数:无
- *返回:无
- *其他:无
- *--------------------------------------------------------------------
- *记录:
- ********************************************************************/
- uint8_t bcd_to_hex(uint8_t val)
- {
- return ((val / 10) << 4) + val % 10;
- }
- void svanner_receive_Rec_IDLE(UART_HandleTypeDef *huart)
- {
- if ((__HAL_UART_GET_FLAG(huart, UART_FLAG_IDLE) != RESET))
- {
- __HAL_UART_CLEAR_IDLEFLAG(huart);
- received_len = DEBUG_BUF_SIZE - __HAL_DMA_GET_COUNTER(huart->hdmarx);
- HAL_UART_DMAStop(huart);
- HAL_UART_Receive_DMA(huart, g_uart2_rx_buf, DEBUG_BUF_SIZE);
- }
- }
- void svanner_receive_analysis(void)
- {
- if(received_len){
- // Van_Device_Printf(VAN_LOG_INFO, "rec QR inif %d \n\r",received_len);
- if (('{' == g_uart2_rx_buf[0]) && (sysinf.updateQR == false)){
- if(0 == parse_qrcode_info(&m_str_card_param_info, (char *)&g_uart2_rx_buf[0])){
- haveheaderflag = QR_REC_STATE_SENDPRAM;
- memcpy(&g_uart2_rx_buf[received_len], sysinf.SN, 7);
- received_len += 7;
- qr_check_delay = 0;
- if((sysinf.psmMaster.state == SW_Scan_Qrcode || sysinf.psmMaster.state == SW_Chip_Id )){
- svanner_receive_Rec_Stop(sysinf.scannerUart);
- sysinf.updateQR = true;
- data_send_to_pc(PC_CMD_QRCODE,(char *)g_uart2_rx_buf, received_len);
- memcpy(&sysinf.psmMaster.card_param_info, &m_str_card_param_info, sizeof(str_card_param_info_t));
- }
- else{
- #ifdef ONECHIP_MINI_PLUSE
- if((sysinf.psmSlave.state == SW_Scan_Qrcode || sysinf.psmSlave.state == SW_Chip_Id )){
- }
- #endif
- }
- sysinf.QRBeepTimeer = 100;
- sysinf.resendeQRtimer = 1;
- HAL_GPIO_WritePin((GPIO_TypeDef *)sysinf.beep_port, sysinf.beep_pin,GPIO_PIN_SET);
- }
- else{
- Van_Device_Printf(VAN_LOG_WARN, "unpack json error \n\r %s",g_uart2_rx_buf);
- }
- }
- else{
- if(sysinf.updateQR == false){
- Van_Device_Printf(VAN_LOG_WARN, "header error \n\r %s",g_uart2_rx_buf);
- svanner_receive_Rec_Start(sysinf.scannerUart);
- }
- }
- }
- return;
- }
- /*****************************************************************************
- *
- *二维码未收到应答,重新上报
- *
- ************************************************************************************/
- void reSend_QR(void)
- {
- if(sysinf.updateQR ){
- sysinf.resendeQRtimer++;
- if((sysinf.resendeQRtimer % QR_RESEND_3s)==0){
- data_send_to_pc(PC_CMD_QRCODE,(char *)g_uart2_rx_buf, received_len);
- if(sysinf.resendeQRtimer > 5*QR_RESEND_3s){
- /*最多重发5次*/
- svanner_receive_Rec_Start(sysinf.scannerUart);
- }
- }
- }
- }
- int parse_qrcode_info(str_card_param_info_t *info, char *qrcode_str)
- {
- int id = 0;
- double Tt = 0;
- double Tt1 = 0;
-
- if (info == 0)
- {
- return -1;
- }
- cJSON *root = cJSON_Parse(qrcode_str);
- if (root == NULL)
- { /*消息不合格*/
- return -1;
- }
- cJSON *item = cJSON_GetObjectItem(root, "p");
- if (item == NULL)
- { /*消息不合格*/
- cJSON_Delete(root);
- return -1;
- }
- char *pid = cJSON_GetStringValue(item);
- // printf("pid=%s \r\n", pid);
- memcpy(info->pid, pid, 10);
- item = cJSON_GetObjectItem(root, "t");
- if (item == NULL)
- { /*消息不合格*/
- cJSON_Delete(root);
- return -1;
- }
- double t = item->valuedouble;
- // printf("t=%f \r\n", t);
- info->temp[0] = (uint8_t)t;
- info->temp[1] = (uint8_t)((t -(uint8_t)t)* 100);
- // 获取数组item
- item = cJSON_GetObjectItem(root, "e");
- if (item == NULL)
- { /*消息不合格*/
- cJSON_Delete(root);
- return -1;
- }
- int test_arry_size = cJSON_GetArraySize(item);
- for (int i = 0; i < test_arry_size; i++)
- {
- // 打印数组里的所有item
- cJSON *sub_array = cJSON_GetArrayItem(item, i);
- cJSON *sub = cJSON_GetObjectItem(sub_array, "i");
- id = sub->valueint;
- // printf("id=%d \r\n", id);
- if(id > 0)
- {
- sub = cJSON_GetObjectItemCaseSensitive(sub_array, "T");
- Tt = sub->valuedouble;
- // printf("Tt=%f \r\n", Tt);
- sub = cJSON_GetObjectItemCaseSensitive(sub_array, "t");
- Tt1 = sub->valuedouble;
- // printf("Tt1=%f \r\n", Tt1);
- }
- else
- {
- Tt = 0;
- Tt1 = 0;
- }
- info->hole_info[i].item = id;
- info->hole_info[i].TtMax[0] = (uint8_t)Tt;
- info->hole_info[i].TtMax[1] = (uint8_t)((Tt -(uint8_t)Tt)* 100);
- info->hole_info[i].TtMin[0] = (uint8_t)Tt1;
- info->hole_info[i].TtMin[1] = (uint8_t)((Tt1 -(uint8_t)Tt1)* 100);
- }
- // 记得删除json
- cJSON_Delete(root);
- return 0;
- }
|