📄 bsp_ser.c
字号:
va_end(v_args);
BSP_Ser_WrStr(buf_str);
}
/*
*********************************************************************************************************
* BSP_Ser_RdByte()
*
* Description : Receive a single byte.
*
* Argument(s) : none.
*
* Return(s) : The received byte.
*
* Caller(s) : Application.
*
* Note(s) : (1) This functions blocks until a data is received.
*
* (2) It can not be called from an ISR.
*********************************************************************************************************
*/
CPU_INT08U BSP_Ser_RdByte (void)
{
CPU_INT08U rx_byte;
BSP_OS_SemWait(&BSP_SerLock, 0); /* Obtain access to the serial interface. */
rx_byte = BSP_Ser_RdByteUnlocked();
BSP_OS_SemPost(&BSP_SerLock); /* Release access to the serial interface. */
return (rx_byte);
}
/*
*********************************************************************************************************
* BSP_Ser_RdByteUnlocked()
*
* Description : Receive a single byte.
*
* Argument(s) : none.
*
* Return(s) : The received byte.
*
* Caller(s) : BSP_Ser_RdByte()
* BSP_Ser_RdStr()
*
* Note(s) : none.
*********************************************************************************************************
*/
CPU_INT08U BSP_Ser_RdByteUnlocked (void)
{
CPU_INT08U rx_byte;
USART_ITConfig(USART2, USART_IT_RXNE, ENABLE); /* Enable the Receive not empty interrupt */
BSP_OS_SemWait(&BSP_SerRxWait, 0); /* Wait until data is received */
USART_ITConfig(USART2, USART_IT_RXNE, DISABLE); /* Disable the Receive not empty interrupt */
rx_byte = BSP_SerRxData; /* Read the data from the temporary register */
return (rx_byte);
}
/*
*********************************************************************************************************
* BSP_Ser_RdStr()
*
* Description : This function reads a string from a UART.
*
* Argument(s) : p_str A pointer to a buffer at which the string can be stored.
*
* len The size of the string that will be read.
*
* Return(s) : none.
*
* Caller(s) : Application
*
* Note(s) : none.
*********************************************************************************************************
*/
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 */
}
/*
*********************************************************************************************************
* BSP_Ser_WrByteUnlocked()
*
* Description : Writes a single byte to a serial port.
*
* Argument(s) : c The character to output.
*
* Return(s) : none.
*
* Caller(s) : BSP_Ser_WrByte()
* BSP_Ser_WrByteUnlocked()
*
* Note(s) : (1) This function blocks until room is available in the UART for the byte to be sent.
*********************************************************************************************************
*/
void BSP_Ser_WrByteUnlocked (CPU_INT08U c)
{
USART_ITConfig(USART2, USART_IT_TC, ENABLE);
USART_SendData(USART2, c);
BSP_OS_SemWait(&BSP_SerTxWait, 0);
USART_ITConfig(USART2, USART_IT_TC, DISABLE);
}
/*
*********************************************************************************************************
* BSP_Ser_WrByte()
*
* Description : Writes a single byte to a serial port.
*
* Argument(s) : tx_byte The character to output.
*
* Return(s) : none.
*
* Caller(s) : Application.
*
* Note(s) : none.
*********************************************************************************************************
*/
void BSP_Ser_WrByte(CPU_INT08U c)
{
BSP_OS_SemWait(&BSP_SerLock, 0); /* Obtain access to the serial interface */
BSP_Ser_WrByteUnlocked(c);
BSP_OS_SemPost(&BSP_SerLock); /* Release access to the serial interface */
}
/*
*********************************************************************************************************
* BSP_Ser_WrStr()
*
* Description : Transmits a string.
*
* Argument(s) : p_str Pointer to the string that will be transmitted.
*
* Caller(s) : Application.
*
* Return(s) : none.
*
* Note(s) : none.
*********************************************************************************************************
*/
void BSP_Ser_WrStr (CPU_CHAR *p_str)
{
CPU_BOOLEAN err;
if (p_str == (CPU_CHAR *)0) {
return;
}
err = BSP_OS_SemWait(&BSP_SerLock, 0); /* Obtain access to the serial interface */
if (err != DEF_OK ) {
return;
}
while ((*p_str) != (CPU_CHAR )0) {
if (*p_str == ASCII_CHAR_LINE_FEED) {
BSP_Ser_WrByteUnlocked(ASCII_CHAR_CARRIAGE_RETURN);
BSP_Ser_WrByteUnlocked(ASCII_CHAR_LINE_FEED);
p_str++;
} else {
BSP_Ser_WrByteUnlocked(*p_str++);
}
}
BSP_OS_SemPost(&BSP_SerLock); /* Release access to the serial interface */
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -