Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C STM32 UART传输问题(阻塞和中断模式)_C_Embedded_Stm32_Uart_Nucleo - Fatal编程技术网

C STM32 UART传输问题(阻塞和中断模式)

C STM32 UART传输问题(阻塞和中断模式),c,embedded,stm32,uart,nucleo,C,Embedded,Stm32,Uart,Nucleo,我对HAL库的HAL_UART_传输功能有问题。我在程序中的两个位置使用此功能: 在函数HAL_UART_RxCpltCallback中,我将中断时接收到的数据写回UART(只是一个回音)。这里一切正常 在Print_CAN_Frame函数中,我在UART上发送每个3s消息(从主函数)。之前,我在那里使用了阻塞功能(HAL_UART_传输)并正确地编程获取数据。但当我把它改为innterrupt(HAL_UART_Transmit_it)时,我得到了屏幕上的奇怪字符:。最有趣的是,这两个函数采

我对HAL库的HAL_UART_传输功能有问题。我在程序中的两个位置使用此功能:

  • 在函数HAL_UART_RxCpltCallback中,我将中断时接收到的数据写回UART(只是一个回音)。这里一切正常

  • 在Print_CAN_Frame函数中,我在UART上发送每个3s消息(从主函数)。之前,我在那里使用了阻塞功能(HAL_UART_传输)并正确地编程获取数据。但当我把它改为innterrupt(HAL_UART_Transmit_it)时,我得到了屏幕上的奇怪字符:。最有趣的是,这两个函数采用相同的参数,因此它们不应该有差异。。。 我使用核仁F303RE板

  • #包括“main.h”
    #包括“main.h”
    #包括“stm32f3xx_hal.h”
    #包括“stm32f303xe.h”
    #包括
    #包括
    #包括
    #包括
    #包括
    void SystemClockConfig(void);
    无效UART2_Init(无效);
    无效HAL_UART_RxCpltCallback(UART_HandletTypeDef*huart);
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef*huart);
    void ClearArray(uint8_t数组[],uint32_t大小);
    无效打印(字符CanFrameName[],uint32\u t CanID,uint32\u t CanDlc,uint8\u t CANSG[]);
    void parseFromUART(char-CanFrame[]);
    uint8_t*convertToHex(字符*字符串);
    void saveDataToFrame(CAN_MessageTypeDef canBuffer);
    #定义真1
    #定义FALSE 0
    #定义FIFO_缓冲区g_rxFifo;
    可以用消息类型定义IPC灯吗=
    {
    0x2214000,//ID
    6,//数据链路连接器
    {0x00,0x00,0x00,0x00,0x00,0x00,0x00},//TX帧
    {0}//RX帧初始化
    };
    CAN_MessageTypeDef canUartBuffer;
    无效系统时钟配置(无效);
    静态void MX_GPIO_Init(void);
    静态void MX_USART2_UART_Init(void);
    uint8数据缓冲区[70];
    uint32_t计数=0;
    uint8\u t rcvd\u数据;
    uint8\u t flag\u UART\u TX\u COMPLETED=FALSE;
    uint8\u t flag\u UART\u RX\u COMPLETED=FALSE;
    内部主(空)
    {
    HAL_Init();
    SystemClock_Config();
    MX_GPIO_Init();
    MX_USART2_UART_Init();
    HAL_UART_接收数据(&huart2,&rcvd_数据,1);
    而(1)
    {
    打印CAN帧(“Tx”、IPC\U LIGHTHS.ID、IPC\U LIGHTHS.DLC、IPC\U LIGHTHS.CAN\U Tx);
    HAL_延迟(3000);
    while((flag_UART_RX_COMPLETED&flag_UART_TX_COMPLETED)=TRUE)
    {
    ClearArray(数据缓冲区,70);
    计数=0;
    flag_UART_RX_COMPLETED=假;
    flag_UART_TX_COMPLETED=FALSE;
    }
    }
    }
    无效系统时钟配置(无效)
    {
    RCC_oscintypedef RCC_OscInitStruct={0};
    RCC_ClkInitTypeDef RCC_ClkInitStruct={0};
    RCC_PeriphCLKInitTypeDef PeriphClkInit={0};
    /**初始化CPU、AHB和APB总线时钟
    */
    RCC_OscInitStruct.OscillatorType=RCC_OscillatorType_HSE;
    RCC_OscInitStruct.HSEState=RCC_HSE_旁路;
    RCC_OscInitStruct.HSIState=RCC_HSI_ON;
    RCC_OscInitStruct.PLL.PLLState=RCC_PLL_NONE;
    如果(HAL_RCC_OscConfig(&RCC_OscInitStruct)!=HAL_OK)
    {
    错误处理程序();
    }
    /**初始化CPU、AHB和APB总线时钟
    */
    RCC_ClkInitStruct.ClockType=RCC_ClockType_HCLK | RCC_ClockType_SYSCLK
    |RCC_CLOCKTYPE_PCLK1 | RCC_CLOCKTYPE_PCLK2;
    RCC_-ClkInitStruct.SYSCLKSource=RCC_-SYSCLKSource\u HSE;
    RCC\u ClkInitStruct.AHBCLKDivider=RCC\u SYSCLK\u DIV1;
    RCC_ClkInitStruct.APB1CLKDivider=RCC_HCLK_DIV2;
    RCC_ClkInitStruct.APB2CLKDivider=RCC_HCLK_DIV1;
    如果(HAL\U RCC\U时钟配置(&RCC\U ClkInitStruct,闪存\U延迟\U 0)!=HAL\U正常)
    {
    错误处理程序();
    }
    PeriphClkInit.PeriphClockSelection=RCC\u PERIPHCLK\u USART2;
    PeriphClkInit.Usart2ClockSelection=RCC\u USART2CLKSOURCE\u PCLK1;
    if(HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit)!=HAL_OK)
    {
    错误处理程序();
    }
    }
    静态void MX_USART2_UART_Init(void)
    {
    huart2.Instance=USART2;
    huart2.Init.BaudRate=115200;
    huart2.Init.WordLength=UART_WordLength_8B;
    huart2.Init.StopBits=UART\u StopBits\u 1;
    huart2.Init.Parity=UART\u Parity\u NONE;
    huart2.Init.Mode=UART\u Mode\u TX\u RX;
    huart2.Init.HwFlowCtl=UART\u HWCONTROL\u NONE;
    huart2.Init.OverSampling=UART\u OverSampling\u 16;
    huart2.Init.OneBitSampling=UART\u一位\u采样\u禁用;
    huart2.AdvancedInit.AdvFeatureInit=UART\u ADVFEATURE\u NO\u INIT;
    if(HAL_UART_Init(&huart2)!=HAL_OK)
    {
    错误处理程序();
    }
    }
    静态void MX_GPIO_Init(void)
    {
    GPIO_InitTypeDef GPIO_InitStruct={0};
    /*GPIO端口时钟启用*/
    __HAL_RCC_GPIOC_CLK_ENABLE();
    __HAL_RCC_GPIOF_CLK_ENABLE();
    __HAL_RCC_GPIOA_CLK_ENABLE();
    __HAL_RCC_GPIOB_CLK_ENABLE();
    /*配置GPIO引脚输出电平*/
    HAL_GPIO_WritePin(LD2_GPIO_端口、LD2_引脚、GPIO_引脚复位);
    /*配置GPIO引脚:B1\U引脚*/
    GPIO_InitStruct.Pin=B1_Pin;
    GPIO_InitStruct.Mode=GPIO_Mode_IT_;
    GPIO_InitStruct.Pull=GPIO_NOPULL;
    HAL_GPIO_Init(B1_GPIO_端口和GPIO_Init结构);
    /*配置GPIO引脚:LD2\U引脚*/
    GPIO_InitStruct.Pin=LD2_Pin;
    GPIO_InitStruct.Mode=GPIO_Mode_OUTPUT_PP;
    GPIO_InitStruct.Pull=GPIO_NOPULL;
    GPIO_InitStruct.Speed=GPIO_Speed_FREQ_LOW;
    HAL_GPIO_Init(LD2_GPIO_端口和GPIO_Init结构);
    }
    无效HAL_UART_RxCpltCallback(UART_HandletTypeDef*huart)
    {
    如果(rcvd_数据=='\r'){
    数据缓冲区[count++]='\r';
    flag_UART_RX_COMPLETED=真;
    如果(HAL\U UART\U传输它(&huart2,数据缓冲区,计数)!=HAL\U OK)
    {
    错误处理程序();
    }
    }
    其他的
    {
    数据缓冲区[count++]=rcvd\U数据;
    }
    HAL_UART_接收数据(&huart2,&rcvd_数据,1);
    }
    无效HAL_UART_TXCPLTCALLLBACK(UART_HandleTypeDef*huart)
    {
    flag_UART_TX_COMPLETED=真;
    }
    无效ClearArray(uint8\u t数组[],uint32\u t大小)
    {
    对于(int i=0;i#include "main.h"
    #include "main.h"
    #include "stm32f3xx_hal.h"
    #include "stm32f303xe.h"
    #include <string.h>
    #include <stdio.h>
    #include <stdint.h>
    #include <stdlib.h>
    #include <inttypes.h>
    
    void SystemClockConfig(void);
    void UART2_Init(void);
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart);
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart);
    void ClearArray(uint8_t array[], uint32_t size);
    void Print_CAN_Frame(char CanFrameName[], uint32_t CanID, uint32_t CanDlc, uint8_t CANmsg[]);
    void parseFromUART(char CanFrame[]);
    uint8_t* convertToHex(char *string);
    void saveDataToFrame(CAN_MessageTypeDef canBuffer);
    
    #define TRUE 1
    #define FALSE 0
    #define FIFO_BUFFER g_rxFifo;
    
    CAN_MessageTypeDef IPC_Ligths =
    {
            0x2214000,                          // ID
            6,                                  // DLC
            {0x00,0x00,0x00,0x00,0x00,0x00},    // TX frame
            {0}                                 // RX frame initialization
    };
    
    CAN_MessageTypeDef canUartBuffer;
    
    void SystemClock_Config(void);
    static void MX_GPIO_Init(void);
    static void MX_USART2_UART_Init(void);
    
    uint8_t data_buffer[70];
    uint32_t count = 0;
    uint8_t rcvd_data;
    uint8_t flag_UART_TX_COMPLETED = FALSE;
    uint8_t flag_UART_RX_COMPLETED = FALSE;
    
    
    int main(void)
    {
     
      HAL_Init();
    
      SystemClock_Config();
      MX_GPIO_Init();
      MX_USART2_UART_Init();
      HAL_UART_Receive_IT(&huart2, &rcvd_data, 1);
     
      while (1)
      {
          Print_CAN_Frame("Tx", IPC_Ligths.ID, IPC_Ligths.DLC, IPC_Ligths.CAN_Tx);
          HAL_Delay(3000);
    
                while((flag_UART_RX_COMPLETED && flag_UART_TX_COMPLETED) == TRUE)
                {
                    ClearArray(data_buffer, 70);
                    count = 0;
                    flag_UART_RX_COMPLETED = FALSE;
                    flag_UART_TX_COMPLETED = FALSE;
                }
      }
    }
    
    
    void SystemClock_Config(void)
    {
      RCC_OscInitTypeDef RCC_OscInitStruct = {0};
      RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};
      RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
    
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
      RCC_OscInitStruct.HSEState = RCC_HSE_BYPASS;
      RCC_OscInitStruct.HSIState = RCC_HSI_ON;
      RCC_OscInitStruct.PLL.PLLState = RCC_PLL_NONE;
      if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
      {
        Error_Handler();
      }
      /** Initializes the CPU, AHB and APB busses clocks 
      */
      RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                                  |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
      RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_HSE;
      RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
      RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
      RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
    
      if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
      {
        Error_Handler();
      }
      PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART2;
      PeriphClkInit.Usart2ClockSelection = RCC_USART2CLKSOURCE_PCLK1;
      if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
      {
        Error_Handler();
      }
    }
    
    static void MX_USART2_UART_Init(void)
    {
      huart2.Instance = USART2;
      huart2.Init.BaudRate = 115200;
      huart2.Init.WordLength = UART_WORDLENGTH_8B;
      huart2.Init.StopBits = UART_STOPBITS_1;
      huart2.Init.Parity = UART_PARITY_NONE;
      huart2.Init.Mode = UART_MODE_TX_RX;
      huart2.Init.HwFlowCtl = UART_HWCONTROL_NONE;
      huart2.Init.OverSampling = UART_OVERSAMPLING_16;
      huart2.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
      huart2.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
      if (HAL_UART_Init(&huart2) != HAL_OK)
      {
        Error_Handler();
      }
    
    }
    
    
    static void MX_GPIO_Init(void)
    {
      GPIO_InitTypeDef GPIO_InitStruct = {0};
    
      /* GPIO Ports Clock Enable */
      __HAL_RCC_GPIOC_CLK_ENABLE();
      __HAL_RCC_GPIOF_CLK_ENABLE();
      __HAL_RCC_GPIOA_CLK_ENABLE();
      __HAL_RCC_GPIOB_CLK_ENABLE();
    
      /*Configure GPIO pin Output Level */
      HAL_GPIO_WritePin(LD2_GPIO_Port, LD2_Pin, GPIO_PIN_RESET);
    
      /*Configure GPIO pin : B1_Pin */
      GPIO_InitStruct.Pin = B1_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_IT_FALLING;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      HAL_GPIO_Init(B1_GPIO_Port, &GPIO_InitStruct);
    
      /*Configure GPIO pin : LD2_Pin */
      GPIO_InitStruct.Pin = LD2_Pin;
      GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
      GPIO_InitStruct.Pull = GPIO_NOPULL;
      GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
      HAL_GPIO_Init(LD2_GPIO_Port, &GPIO_InitStruct);
    
    }
    
    void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
    {
        if (rcvd_data == '\r') {
            data_buffer[count++] = '\r';
            flag_UART_RX_COMPLETED = TRUE;
            if (HAL_UART_Transmit_IT(&huart2, data_buffer, count) != HAL_OK)
            {
                Error_Handler();
            }
        }
        else
        {
            data_buffer[count++] = rcvd_data;
        }
        HAL_UART_Receive_IT(&huart2, &rcvd_data, 1);
    }
    
    void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
    {
            flag_UART_TX_COMPLETED = TRUE;
    }
    void ClearArray(uint8_t array[], uint32_t size)
    {
        for (int i = 0; i < size; ++i)
        {
            array[i] = 0;
        }
    }
    
    void Print_CAN_Frame(char CanFrameName[], uint32_t CanID, uint32_t CanDlc, uint8_t CANmsg[])
    {
        char buffer[100] = {0};
        sprintf(buffer,"CAN_%s| ID:0x%02X| DLC:%d| FRAME: ",CanFrameName,(unsigned int)CanID,(unsigned int)CanDlc);
        for (uint8_t i = 0; i<CanDlc; i++)
        {
            sprintf(buffer+strlen(buffer),"%02X ",*(CANmsg+i)); // print all DATA elements one by one
        }
        sprintf(buffer+strlen(buffer),"\n\r"); // add in the end of each frame new line and ....
    // Problem in here:
        HAL_UART_Transmit_IT(&huart2, (uint8_t*)buffer, strlen(buffer));
    //  HAL_UART_Transmit(&huart2, (uint8_t*)buffer, strlen(buffer),HAL_MAX_DELAY);
    
    }
    
    void Error_Handler(void)
    {
     
        while (1)
            ;
    }
    
    disable_interrupts();
    
    // change variables used by ISR ...
    
    enable_interrupts();
    
    disable_interrupts();
    
    int saved_value_1 = global_variable_1;
    int saved_value_2 = global_variable_2;
    
    enable_interrupts();
    
    // do stuff with the saved_value_* variables ...
    
    event_add(EVENT_TYPE_TXSEND,'\r');
    
    Clear_Array(uint_8Buffer, 70);
        for (uint8_t i = 0U; i<strlen(buffer);i++)
        {
            uint_8Buffer[i] = (uint8_t)buffer[i];
        }
        
    if (HAL_UART_Transmit_IT(&huart2, uint_8Buffer, strlen(buffer)) != HAL_OK)
        {
            Error_Handler();
        }