# 串口DMA+空闲中断

优势:

​ 1.DMA方式跟适合高速、大数据传输,cpu占用率低;

​ 2.DMA传输不占用cpu资源,适合实时性要求高的场景;

​ 3.可稳定处理突发大数据量(文件传输);

精确帧检测:

​ 1.空闲中断可以检测帧结束位置;

​ 2.无需手动计算超时时间;

[文件已丢失]

[!NOTE]

一定要写100,不能strlen(rx_buf),HAL_UARTEx_ReceiveToIdle_DMA在uart.exit里

HAL_UARTEx_RxEventCallback在uart.h里

char rx_buf[100];
char send_buf[100];

HAL_UARTEx_ReceiveToIdle_DMA(&huart1,(uint8_t *)rx_buf,100);
void HAL_UARTEx_RxEventCallback(UART_HandleTypeDef *huart, uint16_t Size)
{
	if(huart ->Instance == USART1)
	{		
			rx_flag = 1;
			rx_size = Size;
			HAL_UARTEx_ReceiveToIdle_DMA(&huart1,(uint8_t *)rx_buf,1000);
	}
}

void handle(void)
{
		if(rx_flag ==1)
		{
			//接收操作
			sprintf(send_buf,"%s",rx_buf);
			HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_buf,strlen(send_buf));
			
			//接收点灯
			if (rx_size==1)
            {
            if (rx_buf[0]=='2')
            	led2_state = 1
            }
			rx_flag = 0;//标志位清零
			memset(rx_buf,0,100);//缓冲区清零
			
			//处理坐标数据
			int x1,x2,y1,y2;
			if(sscanf(rx_buf,"(%d,%d,%d,%d)",&x1,&y1,&x2,&y2)==4)
			{
				//处理坐标数据
			}
			
			rx_flag = 0;
			memset(rx_buf,0,100);
			
			//单个数字转数值
			if(rx_size==1&& is_nub(rx_buf[0]))
				result = rx_buf[0] -'0';
			else
                sprintf(send_buf,"error");
                HAL_UART_Transmit_DMA(&huart1,(uint8_t *)send_buf,strlen(send_buf));
				
		}
}

# char -> int

例如:int a = ‘9’-‘0’=9

int isnum(char a)
{
return (a>='0'&&a<='9')
}