/////////////////////////////////////////////////////頭文件部分/////////////////////////////////////////////////////////////////////////////// #define EMPTY 0xFFFF #define TIMEOUT 0xFFFF #define UART2_RBUF_SIZE 256 //要求:2 的整次冪 #if UART2_RBUF_SIZE < 2 #error UART2_RBUF_SIZE is too small. It must be larger than 1. #elif ((UART2_RBUF_SIZE & (UART2_RBUF_SIZE-1)) != 0) #error UART2_RBUF_SIZE must be a power of 2. #endif typedef struct uart2_rbuf_st { unsigned int in; //輸入 unsigned int out; //輸出 unsigned char buf [UART2_RBUF_SIZE]; //緩沖區空間 }UART2_RBUF_ST; extern UART2_RBUF_ST uart2_rbuf; uint16_t USART2_GetCharBlock(uint16_t timeout); uint16_t USART2_GetChar(void); //////////////////////////////////////////////////////c代碼部分//////////////////////////////////////////////////////////////////////////////// /********************************************************************************** * 串口1接收字符函數,阻塞模式(接收緩沖區中提取) **********************************************************************************/ uint16_t USART2_GetCharBlock(uint16_t timeout) { UART2_RBUF_ST *p = &uart2_rbuf; uint16_t to = timeout; while((p->in - p->out) == 0)if(!(--to))return TIMEOUT; return (p->buf [(p->out++) & (UART2_RBUF_SIZE - 1)]); } /********************************************************************************** * 串口1接收字符函數,非阻塞模式(接收緩沖區中提取) **********************************************************************************/ uint16_t USART2_GetChar(void) { UART2_RBUF_ST *p = &uart2_rbuf; if((p->in - p->out) == 0) //緩沖區空條件 return EMPTY; return USART2_GetCharBlock(1000); } //printf定義 PUTCHAR_PROTOTYPE { HAL_UART_Transmit(&Usart2Handle, (uint8_t *)&ch, 1, 0xFFFF); return ch; } ///////////////////////////////////////////////////中斷處理部分///////////////////////////////////////////////////////////////////////////////// void USART2_IRQHandler(void) { uint8_t d; UART2_RBUF_ST *p = &uart2_rbuf; /* UART in mode Receiver ---------------------------------------------------*/ //if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET) && (__HAL_UART_GET_IT_SOURCE(&Usart2Handle, UART_IT_RXNE) != RESET)) if((__HAL_UART_GET_IT(&Usart2Handle, UART_IT_RXNE) != RESET)) { d = (uint8_t)(Usart2Handle.Instance->RDR); if((p->in - p->out)<UART2_RBUF_SIZE) { p->buf [p->in & (UART2_RBUF_SIZE-1)] = d; p->in++; } while(HAL_IS_BIT_SET(Usart2Handle.Instance->ISR, UART_FLAG_RXNE));//清楚中斷標志 } HAL_UART_IRQHandler(&Usart2Handle); }