void uartRecv_thread(void *inContext) { user_uart_log_trace(); mico_Context_t *Context = inContext; int recvlen; uint8_t *inDataBuffer; OSStatus err = kUnknownErr; inDataBuffer = malloc(UART_ONE_PACKAGE_LENGTH); require(inDataBuffer, exit); while(1) { // get msg from uart recvlen = _uart_get_one_packet(inDataBuffer, UART_ONE_PACKAGE_LENGTH); if (recvlen <= 0) continue; user_uart_log("UART => Module: [%d]=%.*s", recvlen, recvlen, inDataBuffer); // transfer msg to cloud err = MicoFogCloudMsgSend(Context, NULL, 0, inDataBuffer, recvlen); if(kNoErr == err){ user_uart_log("Msg send to cloud success!"); } else{ user_uart_log("Msgsend to cloud failed! err=%d.", err); } } exit: if(inDataBuffer) free(inDataBuffer); }
/* Packet format: BB 00 CMD(2B) Status(2B) datalen(2B) data(x) checksum(2B) * copy to buf, return len = datalen+10 */ size_t _uart_get_one_packet(uint8_t* inBuf, int inBufLen) { user_uart_log_trace(); int datalen; while(1) { if( MicoUartRecv( UART_FOR_MCU, inBuf, inBufLen, UART_RECV_TIMEOUT) == kNoErr){ return inBufLen; } else{ datalen = MicoUartGetLengthInBuffer( UART_FOR_MCU ); if(datalen){ MicoUartRecv(UART_FOR_MCU, inBuf, datalen, UART_RECV_TIMEOUT); return datalen; } } } }
/**************************************************************************** * Function : uartRecv_thread * Description : uart Recv Thread uart 接收线程 * Input Para : * Output Para : * Return Value: ****************************************************************************/ void uartRecv_thread(void *inContext) { user_uart_log_trace(); //mico_Context_t *Context = inContext; int recvlen; tsSL_Message sMessage; //OSStatus err = kUnknownErr; uint8_t *inDataBuffer = malloc(USER_UART_ONE_PACKAGE_LENGTH); //接收数据缓冲 require(inDataBuffer, exit); static uint8_t cmdIndex=0,msgQueIndex=0; memset(zcbReceivedMessageQueue,0x00,ZCB_MAX_MESSAGE_QUEUES * sizeof(tsSL_Message)); while(1) { mico_thread_msleep(10); //延时10ms memset(inDataBuffer,0x0,USER_UART_ONE_PACKAGE_LENGTH); //清空接收数据缓冲 recvlen = user_uartRecv(inDataBuffer, USER_UART_ONE_PACKAGE_LENGTH);//user uart 接收数据 if (recvlen <= 0) continue; recv_buff_parser((char*)inDataBuffer); //解析接收到的数据,把完整的数据包存储在 cmd 数组中 msgQueIndex = 0; for(cmdIndex = 0; cmdIndex < cmdnum; cmdIndex++) //逐条处理 cmd { /* Initialise buffer */ sMessage.u16Type = 0x00; /* Initialise length to large value so CRC is skipped if end received */ sMessage.u16Length = 0xFFFF; //1.get the date from ControlBridge if (eSL_ReadMessage(&sMessage.u16Type, &sMessage.u16Length, SL_MAX_MESSAGE_LENGTH, sMessage.au8Message,(unsigned char*)cmdbuff[cmdIndex],strlen(cmdbuff[cmdIndex])) == E_SL_OK) { user_uart_log("msg get,type:%d,length:%d",sMessage.u16Type,sMessage.u16Length); //消息类型 //if(0x8046 == sMessage.u16Type) //{ //// user_uart_log("%d",msgQueIndex); //} //if(0x4D == sMessage.u16Type) //{ // user_uart_log("%d",msgQueIndex); //} for(; msgQueIndex< ZCB_MAX_MESSAGE_QUEUES ; msgQueIndex++) { if(0 == zcbReceivedMessageQueue[msgQueIndex].u16Type) { //user_uart_log("%d saved at %d",sMessage.u16Type,msgQueIndex); zcbReceivedMessageQueue[msgQueIndex].u16Type = sMessage.u16Type; zcbReceivedMessageQueue[msgQueIndex].u16Length = sMessage.u16Length; memcpy(zcbReceivedMessageQueue[msgQueIndex].au8Message,sMessage.au8Message,sMessage.u16Length); break; } else { continue; } } if(msgQueIndex == ZCB_MAX_MESSAGE_QUEUES) user_uart_log("no space for Msg"); } else { user_uart_log("msg not correct"); for(cmdIndex=0; cmdbuff[cmdnum][cmdIndex]!=0x0; cmdIndex++) { printf("%x ",cmdbuff[cmdnum][cmdIndex]); } printf("\r\n"); } } memset(cmdbuff[0], 0x0, sizeof(cmdbuff[0])* cmdnum); cmdnum = 0; } exit: if(inDataBuffer) free(inDataBuffer); }