紧接着上一篇文章,如何合理处理多个串口接收大量数据。此种方法,很厉害,很NB,首先,利用DMA 可节省大量CUP资源。其次,利用IDLE空闲中断来接收位置个数的数据。最后利用串口DMA环形数据的偏移量、长度,入队,出队处理数据。保证了任务的流畅处理。
串口接收数据:
中心思想
1、开启DMA 环形接收数据模式。
2、触发接收数据中断。
3、假如数据有进来,将上面环形数据的偏移量与长度 入队。
4、出队函数,处理数据。
直接上代码
两个任务完成
#define MAX_FRAME_DISP_LEN 125
#define MAX_FRAME_DISP_ITEM 5
#define MaxSize_FRAME_DISP (MAX_FRAME_DISP_LEN*MAX_FRAME_DISP_ITEM)
static void RecUart1Temp_Task(void* parameter)
{
uint16_t len;
uint16_t ndtr_last;//上次剩余个数
BufferLoopData_Typedef buffer_loop;
BaseType_t xReturn = pdPASS;
buffer_loop.start_addr = 0;
buffer_loop.len = 0;
ndtr_last = MaxSize_FRAME_DISP;
while (1)
{
//等待有数据消息
xReturn = xSemaphoreTake(BinarySem_Handle, portMAX_DELAY);
len = Reg_Usart1_CHANNEL_CNDTR;//DMA剩余个数
//环形数组
if (ndtr_last != len)//上次与这