void BSP_Ser_RdStr (CPU_CHAR *p_str, CPU_INT16U len) { CPU_CHAR rx_data; CPU_CHAR rx_buf_ix; CPU_BOOLEAN bContinueRx; CPU_BOOLEAN err; rx_buf_ix = 0; p_str[0] = 0; bContinueRx = DEF_TRUE; if (BSP_SerialInitilizated == DEF_TRUE) { err = BSP_OS_SemWait(&BSP_SerLock, 0); /* Obtain access to the serial interface */ if (err != DEF_OK ) { return; } do { rx_data = BSP_Ser_RdByteUnlocked(); if ((rx_data == ASCII_CHAR_CARRIAGE_RETURN) || /* Is it '\r' or '\n' character ? */ (rx_data == ASCII_CHAR_LINE_FEED )) { BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_LINE_FEED); BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_CARRIAGE_RETURN); p_str[rx_buf_ix] = 0; /* set the null character at the end of the string */ bContinueRx = DEF_FALSE; /* exit the loop */ } else if (rx_data == ASCII_CHAR_BACKSPACE) { /* Is backspace character ? */ if (rx_buf_ix > 0) { BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_BACKSPACE); BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_SPACE); BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_BACKSPACE); rx_buf_ix--; /* Decrement the index */ p_str[rx_buf_ix] = 0; } } else if (ASCII_IsPrint(rx_data)) { /* Is it a printable character ... ? */ BSP_Ser_WrByteUnlocked((CPU_INT08U)rx_data); /* Echo-back */ p_str[rx_buf_ix] = rx_data; /* Save the received character in the buffer */ rx_buf_ix++; /* Increment the buffer index */ if (rx_buf_ix >= len) { rx_buf_ix = len; } } } while (bContinueRx == DEF_TRUE); BSP_OS_SemPost(&BSP_SerLock); /* Release access to the serial interface */ } }
void BSP_Ser_RdStr (CPU_CHAR *p_str, CPU_INT16U len) { CPU_CHAR *p_char; CPU_BOOLEAN rxd_history_char0; CPU_CHAR rx_data; CPU_BOOLEAN err; rxd_history_char0 = DEF_NO; p_str[0] = (CPU_CHAR)'\0'; p_char = p_str; err = BSP_OS_SemWait(&BSP_SerLock, 0); /* Obtain access to the serial interface */ if (err != DEF_OK ) { return; } while (DEF_TRUE) { rx_data = BSP_Ser_RdByteUnlocked(); if ((rx_data == ASCII_CHAR_CARRIAGE_RETURN) || /* Is it '\r' or '\n' character ? */ (rx_data == ASCII_CHAR_LINE_FEED )) { BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_LINE_FEED); BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_CARRIAGE_RETURN); *p_char = (CPU_CHAR)'\0'; /* set the null character at the end of the string */ #if (BSP_CFG_SER_CMD_HISTORY_LEN > 0u) Str_Copy(BSP_SerCmdHistory, p_str); #endif break; /* exit the loop */ } if (rx_data == ASCII_CHAR_BACKSPACE) { /* Is backspace character */ if (p_char > p_str) { BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_BACKSPACE); p_char--; /* Decrement the index */ } } if ((ASCII_IsPrint(rx_data) ) && (rxd_history_char0 == DEF_NO)) { /* Is it a printable character ... ? */ BSP_Ser_WrByteUnlocked((CPU_INT08U)rx_data); /* Echo-back */ *p_char = rx_data; /* Save the received character in the buffer */ p_char++; /* Increment the buffer index */ if (p_char >= &p_str[len]) { p_char = &p_str[len]; } } else if ((rx_data == ASCII_CHAR_ESCAPE) && (rxd_history_char0 == DEF_NO )) { rxd_history_char0 = DEF_YES; #if (BSP_CFG_SER_CMD_HISTORY_LEN > 0u) } else if ((rx_data == ASCII_CHAR_LEFT_SQUARE_BRACKET) && (rxd_history_char0 == DEF_YES )) { while (p_char != p_str) { BSP_Ser_WrByteUnlocked((CPU_INT08U)ASCII_CHAR_BACKSPACE); p_char--; /* Decrement the index */ } Str_Copy(p_str, BSP_SerCmdHistory); while (*p_char != '\0') { BSP_Ser_WrByteUnlocked(*p_char++); } #endif } else { rxd_history_char0 = DEF_NO; } } BSP_OS_SemPost(&BSP_SerLock); /* Release access to the serial interface */ }