在线时间2 小时
UID3562033
ST金币0
蝴蝶豆0
注册时间2019-5-9
新手上路
- 最后登录
- 2020-7-10
|
楼主 |
发表于 2019-5-23 09:19:57
|
显示全部楼层
a0a.1 0b0c
这块是中断的处理代码
void USART3_IRQHandler() //串口3中断接收数据
{
RxTimeout =10;
HAL_NVIC_ClearPendingIRQ(USART3_IRQn); // 清除中断标志位 解决使用DMA发送后,一直进入接收中断的问题
HAL_UART_IRQHandler(&Uart3Handle); //中断处理函数 清除中断标注位 会间接的调用接收回调函数
if (RxCount< Rx_MAXSIZE) //接收缓冲区没满 还可以接收数据
{
RxBuf[RxCount++]=RxData; //接收的数据放在接受缓冲区中
}
else
{
USART3_RX_STA|=1<<15; //缓冲区已满 强制标记接收完成
ReceCount=RxCount; //记录接收到的数据个数
RxCount=0; //接收数量清零
RxTimeout=0; //接收超时清零
}
HAL_UART_Receive_IT(&Uart3Handle, (uint8_t *)(&RxData), 1); //** 接收完成后会关闭中断所以要循环调用次函数 接收一个字节进入一次接收完成回调函数
}
void DMA1_Channel2_IRQHandler(void)
{
HAL_DMA_IRQHandler(Uart3Handle.hdmatx);
}
在定时器里进行超时的接收完成
__weak void HAL_IncTick(void)
{
uwTick++;
if (RxTimeout>0) //2019-05-20 zhang
{
RxTimeout--;
if(RxTimeout==0)
{
USART3_RX_STA|=1<<15; //接收超时 标记接收完成
ReceCount =RxCount; //记录接收到的数据个数
RxCount=0; //接收数量清零
RxTimeout=0; //接收超时清零
}
}
}
在主函数里面判断 接收标志位,将收到的数据发送回来
if(USART3_RX_STA&0X8000) //接收到数据
{
HAL_sta=HAL_UART_Transmit_DMA(&Uart3Handle,RxBuf, ReceCount);
while(TX_END !=1) {} //等待放松完成
//HAL_UART_Transmit(&UartHandle,RxBuf, ReceCount,2000);
ReceCount=0;
USART3_RX_STA=0;
}
|
|