小编实际操作中,用HAL_UART_RxCpltCallback函数配置接收串口数据,在测试过程中用手碰了单片机引脚之后无法再接收到数据,终于找到了解决办法,就是自己使能接收中断和自己定义中断回调函数;
使能中断
__HAL_UART_ENABLE_IT(&huart1,UART_IT_IDLE); //空闲中断使能
__HAL_UART_ENABLE_IT(&huart1,UART_IT_RXNE); //接收中断使能
中断回调函数
void user_uart1IT_ReceiveCallback(void)
{
static uint8_t* pBuff = uart1_data.uart1_rxbuff;
static uint8_t size_cnt=0;
uint8_t receive_dat;
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_RXNE) != RESET) //uart rx flag
{
receive_dat = (uint16_t) READ_REG(huart1.Instance->DR);
*(pBuff++) = receive_dat;
size_cnt++;
__HAL_UART_CLEAR_FLAG(&huart1,UART_FLAG_RXNE);
}
if(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_IDLE) != RESET) //uart idle flag
{
uart1_state.bits.interrupt_idle = ON; //set flag
uart1_data.uart1_count = size_cnt;
receive_dat = (uint16_t) READ_REG(huart1.Instance->DR); //clear reg
size_cnt=0;
pBuff = uart1_data.uart1_rxbuff;
__HAL_UART_CLEAR_IDLEFLAG(&huart1);
}
}
本程序包含自己定制的AT指令上图片
源码链接:https://github.com/NoSmallWhite/WL-open-projects
文件名:demo-adc-vet6-20200708-1732 自定义AT指令字取出任意字符串
二、更新记录1:
1、接收大量数据“ORE”位报故障,“ORE:过载错误 (Overrun error) ”
2、解决办法:添加串口故障回调函数,有故障就清零标志
/******************************************************************************************
*** 函数名称: HAL_UART_ErrorCallback
*** 输入参数: 无
*** 返 回 值: 无
*** 说 明:故障回调-查看故障状态
*** 调度时间:无
*** 编者 时间 版本
*** XXXZ XXXX/XX/XX V0.1
******************************************************************************************/
void HAL_UART_ErrorCallback(UART_HandleTypeDef *huart)
{
if(huart->Instance == UART4) //判断串口错误回调函数,串口是否为IAP串口函数
{
if(__HAL_UART_GET_FLAG(UART_IAP, UART_FLAG_ORE) != RESET) //串口过载错误,清零标志并且重新打开串口接收中断
{
__HAL_UART_CLEAR_OREFLAG(UART_IAP);
}
__HAL_UART_ENABLE_IT(UART_IAP,UART_IT_RXNE); //接收中断使能,自己可以判断接收标志,第一种中断方式
__HAL_UART_CLEAR_FLAG(UART_IAP,UART_FLAG_RXNE); //清除接收标志
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)