void uartRecv_thread(void *inContext) { uart_recv_log_trace(); mico_Context_t *Context = inContext; int recvlen; uint8_t *inDataBuffer; inDataBuffer = malloc(UART_ONE_PACKAGE_LENGTH); require(inDataBuffer, exit); while(1) { recvlen = _uart_get_one_packet(inDataBuffer, UART_ONE_PACKAGE_LENGTH); if (recvlen <= 0) continue; sppUartCommandProcess(inDataBuffer, recvlen, Context); } 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) { uart_recv_log_trace(); int datalen; while(1) { if( PlatformUartRecv(inBuf, inBufLen, UART_RECV_TIMEOUT) == kNoErr){ return inBufLen; }else{ datalen = PlatformUartRecvedDataLen(); if(datalen){ PlatformUartRecv(inBuf, datalen, UART_RECV_TIMEOUT); return datalen; } } } }
/* Packet format: BB 00 CMD(2B) Status(2B) datalen(2B) data(x) checksum(2B) * copy to buf, return len = datalen+10 */ int _uart_get_one_packet(uint8_t* inBuf, int inBufLen) { uart_recv_log_trace(); OSStatus err = kNoErr; int datalen; uint8_t *p; while(1) { p = inBuf; err = PlatformUartRecv(p, 1, MICO_WAIT_FOREVER); require_noerr(err, exit); require(*p == 0xBB, exit); p++; err = PlatformUartRecv(p, 1, 1000); require_noerr(err, exit); require(*p == 0x00, exit); p++; err = PlatformUartRecv(p, 6, 1000); require_noerr(err, exit); datalen = p[4] + (p[5]<<8); require(datalen + 10 <= inBufLen, exit); p += 6; err = PlatformUartRecv(p, datalen+2, 1000); require_noerr(err, exit); err = check_sum(inBuf, datalen + 10); require_noerr(err, exit); return datalen + 10; } exit: return -1; }
/* 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) { uart_recv_log_trace(); int datalen; while(1) { if( MicoUartRecv( UART_FOR_APP, inBuf, inBufLen, UART_RECV_TIMEOUT) == kNoErr) { return inBufLen; } else { datalen = MicoUartGetLengthInBuffer( UART_FOR_APP ); if(datalen) { MicoUartRecv(UART_FOR_APP, inBuf, datalen, UART_RECV_TIMEOUT); return datalen; } } } }