删除了一些不重要的东西,寄存器以及配置过程只需要了解,其他的还是快速上手为准
实用内容:模式一 不启动中断方式通讯
1、 HAL_UART_Receive(&huart1, dat, 3, 9000); //接收数据,一般因为有时间限制(例如9000),所以建议在循环中接收
2、 HAL_UART_Transmit(&huart1, dat, 3, 9000); //发送数据,可以再程序中执行一次。
个人感觉不开中断的方式不实用,当然个人经验较少,可能某些情况下比较好用。
实用内容:模式二 启用中断方式通讯
1、main()中接收指令 HAL_UART_Receive_IT(&huart1, buff, 50);//中断接收
2、接收完成中断函数里
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) // 自己添加的回调函数
{
if (huart->Instance==USART1) {
HAL_UART_Transmit_IT(&huart1, buff, 50);//发送回去
HAL_UART_Receive_IT(&huart1, buff, 50);//开启接收
}
3、HAL_UART_Transmit_IT(huart, pData, Size)//发送
实用内容:模式三 启用DMA中断方式通讯
HAL_UART_Transmit_DMA(huart, pData, Size) //发送
HAL_UART_Receive_DMA(huart, pData, Size) //接收
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)//同一个回调函数
实用内容:空闲中断
1、单字节接收我觉得挺好用,不知道有什么局限不
2、__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE) //开启空闲中断
3、中断代码,因为空闲中断没有发完,进不了发送完成中断里,所以要在USART1_IRQHandler里写判断
void USART1_IRQHandler(void)
{
if(__HAL_UART_GET_FLAG(&huart1,UART_FLAG_IDLE)!=RESET) //空闲中断判断 __HAL_UART_GET_FLAG获取指定中断
{
uint8_t len=0;//定义长度
__HAL_UART_CLEAR_IDLEFLAG(&huart1);//清除空间中断
//之后这里可以多次判断以便排除干扰
HAL_UART_DMAStop(&huart1);//停止DMA
len=100-__HAL_DMA_GET_COUNTER(huart1.hdmarx);//获取已接收长度
{//括号内可以到处理函数中
xxxx(len);//处理函数
HAL_UART_Receive_DMA(&huart1,rebuff,100);//重新开启接收
}
}
HAL_UART_IRQHandler(&huart1);
}