我有一个程序,它在消息发送后250毫秒之前启用中断接收,250毫秒之后它应该会禁用中断,在新消息发送之前不应该接收任何消息。我写了一些类似的东西,我认为如果我可以禁用Receive_it,但找不到任何关于它的,它会起作用
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
i = rand() % 250 ;
CAN_TxData[0] = i ;
came = 1;
currTime = HAL_GetTick();
HAL_CAN_AddTxMessage(&hcan1, &CAN_TxHeader, CAN_TxData, &CAN_TxMailBox); // yollama kodu
while((HAL_GetTick()-currTime <= 250) && came)
{
HAL_UART_Receive_IT(&huart2, TTL_RxData, 8);
}
if (HAL_GetTick()-currTime > 250)
{
// Here I should disable receive IT
timeoutted ++;
}
}
由于每个人都抱怨我的解决方案,我想澄清一下我的项目。
第一个stm32将使用CAN向第二个stm32发送8字节的数据,第二个stm32将使用USART向第一个stm32发送相同的数据。
如果第一个stm32在其自己的消息后250ms收到消息,它将检查其发送的消息是否相同,然后记录它(正确++和错误++(。但如果250毫秒过去了,第一个stm32没有收到任何结果,它会说这是超时,并将再次启动相同的过程。这种情况将继续下去。
这段代码毫无意义。
您在循环中调用HAL_UART_Receive_IT
函数(它只设置内容,但不等待任何内容(。在这个循环中,它被调用了数百次(甚至数千次(。
你能做什么:
- 将计时器中断设置为250ms
- 如果IT接收完整回调在到期前被触发,则禁用计时器中断
- 如果调用了定时器中断,只需中止IT接收
HAL_UART_AbortReceive_IT
(这也将禁用此中断(