利用FIFO存储串口接收到的字符信息。
FIFO如何构造?
1. 构造一个FIFO结构体: static str_rbuf rec_buf;
2. 构造一个真正的FIFO缓冲区:static uint8_t receive_buffer[100];
3. 初始化,关联FIFO结构体和缓冲区
rbuf_init(&rec_buf, receive_buffer, 1, 100);
4. 在串口接收中断函数里,将接收到的数据压入到FIFO缓冲区中,并产生串口接收到数据的事件。
在主程序中不断查询事件的发生。如果串口接收事件发生,则执行该事件。
具体代码:
-
uint8_t receivedChar;
-
static void OnCharRecEvent(void* data);
-
static event_t charRecEvent = EVENT_INIT(OnCharRecEvent);
-
-
// ---------------------------------------------------------------------
-
static str_rbuf rec_buf;
-
static uint8_t receive_buffer[100];
-
-
// 初始化FIFO结构体和缓冲区
-
void uart_ringBuffer_Init(void)
-
{
-
rbuf_init(&rec_buf, receive_buffer, 1, 100);
-
}
-
-
-
-
//------------------------------------------------------------------------
-
void USART1_IRQHandler(void)
-
{
-
uint8_t tmp_remove = 0;
-
-
if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
-
{
-
receivedChar = USART_ReceiveData(USART1);
-
-
if ( rbuf_nr_of_items ( &rec_buf ) == rec_buf.max_entries)
-
{
-
/*如果buffer已满,并且此时受到数据,则从当前读指针读出一个数据,抛弃掉。*/
-
rbuf_pull ( &rec_buf, &tmp_remove );
-
}
-
-
/* 将新的数据加入到buffer中,注意:这里当FIFO为满的时候,新数据还是可以写进去,只是把以前老的数据给覆盖了。 */
-
rbuf_push ( &rec_buf, (uint8_t *)&receivedChar );
-
-
-
// 添加事件,通知主程序,发生中断接收事件。
-
// 进行异步处理。
-
EventQueue_Enqueue_ISR(&charRecEvent); /* 中断事件发生 */
-
}
-
}
-
-
-
/* 接收中断事件处理函数 */
-
static void OnCharRecEvent(void* data)
-
{
-
static uint8_t a_tmp = 0;
-
-
//将FIFO缓冲区中的数据读完为止
-
while (rbuf_nr_of_items ( &rec_buf ) != 0)
-
{
-
rbuf_pull(&rec_buf, &a_tmp);
-
uart_sendChar(a_tmp);
-
-
DI_CallbackISR_ByteReceived(a_tmp);
-
}
-
}
-
-
-
void DI_CallbackISR_ByteReceived(uint8_t rxByte)
-
{
-
// state machine here.
-
}
主函数只需添加初始化FIFO的函数,就OK了。
-
int main(void)
-
{
-
volatile static event_t* event;
-
board_init();
-
keyScanTask_init();
-
uart_ringBuffer_Init();
-
-
while(1)
-
{
-
event = EventQueue_GetPendingEvent();
-
if (event)
-
{
-
event->execute(event->data);
-
}
-
}
-
}
阅读(1765) | 评论(0) | 转发(0) |