c - STM32 usart中断无法将正确的数据转换为其他函数

标签 c interrupt stm32f4discovery usart stm32-hal

当我使用stm32发现板向另一个发现板发送数据时遇到一些问题,它可以获取正确的数据并在回调函数中打印,但无法在其他函数中正确打印。

void UART7_IRQHandler()
{
    HAL_UART_IRQHandler(&huart7);
    HAL_UART_Receive_IT(&huart7, (uint8_t *)UART7RxBuffer, 16);
}
void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart)  
{   
    if(huart->Instance == UART7) {
        X = (UART7RxBuffer[1]-48) + (UART7RxBuffer[3]-48)*0.1 + (UART7RxBuffer[4]-48)*0.01 + (UART7RxBuffer[5]-48)*0.001;           
    }
}

但是我收到这样的错误数据

void controller(){
    printf("%.3f\t\n", X);
}

它应该是0.012,并且在HAL_UART_RxCpltCallback()中是正确的,我在 Controller 中收到-38.02、-0.009、0.512、0.012、-1.948等。我该怎么做才能避免这种情况?

最佳答案

在不知道您的 MCU 是否实际上支持浮点等的情况下,我可能会做这样的事情来诊断/调试正在发生的事情:

void UART7_IRQHandler()
{
    HAL_UART_IRQHandler(&huart7);
    HAL_UART_Receive_IT(&huart7, (uint8_t *)UART7RxBuffer, 16);
}

char d1;
char d2;
char d3;
char d4;
float X1;
float X2;
float X3;
float X4;
float X;

void HAL_UART_RxCpltCallback(UART_HandleTypeDef* huart)  
{   
    if(huart->Instance == UART7) {
        d1 = UART7RxBuffer[1]-48;  /* add breakpoint here, and single step from here while inspecting variables */
        d2 = UART7RxBuffer[3]-48;
        d2 = UART7RxBuffer[4]-48;
        d3 = UART7RxBuffer[5]-48;
        X1 = d1;
        X2 = d2 * 0.1;
        X3 = d3 * 0.01;
        X4 = d4 * 0.001;
        X = X1 + X2 + X3 + X4;
    }
}

关于c - STM32 usart中断无法将正确的数据转换为其他函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47309874/

相关文章:

embedded - 当全局中断被禁用时,中断是否保持其状态?

c - 窗口看门狗定时器STM32F4

c - snprintf 在 Xcode 中使用 Guard Malloc 编译时会产生 EXC_BAD_ACCESS

c - 如何将 MSB 复制到字节的其余部分?

c - Ansi C 中的位设置和位移位

c - 中断 vector 处理程序地址

使用 stm32f429-discovery LTDC 控制 WVGA 显示器

c - STM32 DMA(并发流、FIFO、突发模式、双缓冲)

c++ - 本地址中的内容被换出和返回时,存储在指针中的地址会发生什么变化?

c - 如何确定C中结构体的大小