示例#1
0
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);
}
示例#2
0
/* 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);
}