1 信号量
结合之前我们学过的空闲中断加上DMA
void usart1_recv_thread_entry(void *parameter)
{
rt_err_t uwRet = RT_EOK;
while(1)
{
uwRet =rt_sem_take(usart1_recv_sem, RT_WAITING_FOREVER);//获取串口2接收帧完成信号量
if(RT_EOK == uwRet )
{
HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
}
}
}
我们定义开一个线程来处理信号量的释放
void hal_uart_recv_judge(void)
{
/* 1. 判断是否有完整数据 */
if(usart_nb_type.usart_recv_flag == 1)
{
/* 2. 打印数据到指定串口 */
HAL_UART_Transmit(&huart1 ,usart_nb_type.usart_recv_buffer ,usart_nb_type.usart_recv_len ,100 );
rt_sem_release(usart1_recv_sem);//释放一个信号量//我们在这里来释放信号量
/* 3. 清空接收缓存区 */
memset(usart_nb_type.usart_recv_buffer ,0 ,usart_nb_type.usart_recv_len);
/* 4. 清空数据接收标志 */
usart_nb_type.usart_recv_flag = 0;
/* 5. 清空数据接收长度 */
usart_nb_type.usart_recv_len = 0;
}
}