|
void bsp_485_IRQHandler(void)
{
static uint8_t idle_time=0;
uint8_t temp,rx_len,i;
uint8_t choose_get=1;
uint8_t choose_set=2;
uint8_t uart_error[20];
uint8_t ch=0;
uint8_t uart_p;
// if(uart_p<UART_BUFF_SIZE)
// {
// if(__HAL_UART_GET_FLAG( &Uart5_Handle, UART_FLAG_RXNE ) != RESET)//__HAL_UART_GET_IT
// {
//// HAL_UART_Receive(&Uart5_Handle, (uint8_t *)(&uart_buff[uart_p]),51 , 100);
// HAL_UART_Receive(&Uart5_Handle, uart5_dma_1,51 , 1000);
// __HAL_UART_CLEAR_FLAG(&Uart5_Handle,UART_FLAG_RXNE );
//// READ_REG(Uart5_Handle.Instance->RDR);
//// __HAL_UART_CLEAR_FLAG(&Uart5_Handle,UART_IT_RXNE);
//// u5_printf("%c",uart_buff[uart_p]);
//// printf("%c",uart_buff[uart_p]);
//// uart_p++;
//
// }
//// HAL_UART_IRQHandler(&Uart5_Handle);
if(__HAL_UART_GET_FLAG(&Uart5_Handle,UART_FLAG_IDLE) != RESET)
{
// uart_p=0;
// READ_REG(Uart5_Handle.Instance->RDR);
// HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
// HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
__HAL_UART_CLEAR_IDLEFLAG(&Uart5_Handle); //清除标志位
HAL_UART_DMAStop(&Uart5_Handle);
if(idle_time>0)
{
// HAL_UART_DMAStop(&Uart5_Handle); //先停止DMA,暂停接收
// temp = __HAL_DMA_GET_COUNTER(&DMA_Handle_uart5_rx);// 获取DMA未传输个数
// rx_len = 70 - temp; //总数减去未传输个数,得到已接收数据的个数
if(uart5_dma_1[3]==0xc1)//表示查询命令,收到该命令后让电机数组得到dma数组的数据
{
_u5_485_dma_get_or_set(uart5_dma_1,choose_get);
}
// memset(uart5_dma_1,0,rx_len);
for(i=0;i<60 ;i++)
{
uart5_dma_1=0;
}
rx_len=0;
// HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
// HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
// __HAL_UART_CLEAR_IDLEFLAG(&Uart5_Handle);
// u5_printf("产生串口5空闲中断\n");
}
idle_time=2;
HAL_UART_Receive_DMA(&Uart5_Handle,uart5_dma_1,70);//打开DMA接收
}
if(__HAL_UART_GET_FLAG(&Uart5_Handle,UART_FLAG_ORE) != RESET)
{
// HAL_UART_Receive(&Uart5_Handle, &ch,1 , 100);
__HAL_UART_CLEAR_OREFLAG(&Uart5_Handle);
READ_REG(Uart5_Handle.Instance->RDR);
// HAL_UART_Receive_IT(&Uart5_Handle,uart_error,5);
// HAL_UART_Receive(&Uart5_Handle, uint8_t *pData, uint16_t Size, uint32_t Timeout);
}
// HAL_NVIC_DisableIRQ(_485_INT_IRQ);
// __HAL_UART_DISABLE_IT(&Uart5_Handle,UART_IT_RXNE);
// __HAL_UART_DISABLE_IT(&Uart5_Handle,UART_IT_IDLE);
// __HAL_UART_ENABLE_IT(&Uart5_Handle,UART_IT_IDLE);
HAL_NVIC_DisableIRQ(_485_INT_IRQ);
// __HAL_UART_DISABLE(&Uart5_Handle);
// if(__HAL_UART_GET_IT( &Uart5_Handle, UART_IT_IDLE ) != RESET)
// {
// for(i=0;i<uart_p;i++)
// {
// printf("%c ",uart_buff);
// u5_printf("%c",uart_buff);
// }
// uart_p=0;
// }
// }
// else
// {
// clean_rebuff();
// }
// HAL_UART_IRQHandler(&Uart5_Handle);
}
用了串口5空闲中断配合DMA实现不定长传输,第一波数据没有问题,从第二波数据开始仿真结果显示接收数组接收的数据出现移位情况
第一波数据
第二波数据
第三波数据
|
|