M69002400 2024-07-21 11:29 采纳率: 0%
浏览 5
已结题

串口发送数据和接收数据

#include "main.h"
#include "tim.h"
#include "usart.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "dac711.h"
#include "myusart.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */

/* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/

/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
 
/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART1_UART_Init();
  MX_USART2_UART_Init();
  MX_USART3_UART_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
     DAC7311_Init();                                
       HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1);

     /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  
  while (1)
  {
    /* USER CODE END WHILE */
   
        
        
        
        /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void)
{
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

  /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

  /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  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_2) != HAL_OK)
  {
    Error_Handler();
  }
}
```c
#include "dac711.h"
#include "string.h"
#include "stdio.h"
uint16_t cnum;
void delay(uint8_t us)
{
    for(; us !=0; us--);
}

void DAC7311_Init(void)
{
    AO1_SYNC_H();
    AO1_SCLK_L();
}

void AO1_Write(uint16_t Data)
{
    uint8_t temp;
    uint8_t    ui;
    
    temp=Data << 2;//7311ÐèÒªÒÆÁ½Î»
    temp &= 0x3FFF;//Ñ¡ÔñģʽΪNormal
    AO1_SYNC_H();
    AO1_SCLK_H();
    delay(10);
    AO1_SYNC_L();//ʹÄÜÊäÈëÒÆλ¼Ä´æÆ÷
    delay(10);
    
    for(ui=0; ui<16; ui++)
    {
        
        AO1_SCLK_H();
        
        if(0x8000 == (temp & 0x8000))
        {
            AO1_DIN_H();
        }
        else
        {
            AO1_DIN_L();
        }
        delay(10);
        AO1_SCLK_L();
        delay(10);
        temp <<=1;
    }
    
    AO1_SYNC_H();

}
```c

#include "myusart.h"
#include "string.h"
#include "stdio.h"
#include "dac711.h"
uint8_t USART1_RX_BUF[USART1_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART1_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART1_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
uint32_t hex_to_decimal(uint8_t *hex_array, uint16_t length);
char receivedHex[3] = {0}; // ´æ´¢½ÓÊÕµ½µÄÁ½¸ö16½øÖÆ×Ö·ûºÍÒ»¸ö½áÊø·û

uint8_t USART2_RX_BUF[USART2_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART2_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART2_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
uint8_t RS485orBT;//µ±RS485orBT±ê־λΪ1ʱÊÇRS485ģʽ£¬Îª0ʱÊÇÀ¶ÑÀģʽ

uint8_t USART3_RX_BUF[USART3_REC_LEN];//½ÓÊÕ»º³å,×î´óUSART_REC_LEN¸ö×Ö½Ú.
uint16_t USART3_RX_STA=0;//½ÓÊÕ״̬±ê¼Ç//bit15£º½ÓÊÕÍê³É±êÖ¾£¬bit14£º½ÓÊÕµ½0x0d£¬bit13~0£º½ÓÊÕµ½µÄÓÐЧ×Ö½ÚÊýÄ¿
uint8_t USART3_NewData;//µ±Ç°´®¿ÚÖжϽÓÊÕµÄ1¸ö×Ö½ÚÊý¾ÝµÄ»º´æ
int decimalNumber=0;
int i=0;
int fputc(int ch, FILE *f)
{
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xffff);
  return ch;
}

int fgetc(FILE *f)
{
  uint8_t ch = 0;
  HAL_UART_Receive(&huart1, &ch, 1, 0xffff);
  return ch;
}


uint8_t My_RXData;
void  HAL_UART_RxCpltCallback(UART_HandleTypeDef  *huart)//´®¿ÚÖжϻص÷º¯Êý
{
    if(huart ==&huart1)//ÅжÏÖжÏÀ´Ô´£¨´®¿Ú1£ºUSBת´®¿Ú£©
    {
       My_RXData = USART1_NewData;
             AO1_Write(My_RXData*16); 
       HAL_UART_Receive_IT(&huart1,(uint8_t *)&USART1_NewData,1); //ÔÙ¿ªÆô½ÓÊÕÖжÏ
    }
    if(huart ==&huart2)//ÅжÏÖжÏÀ´Ô´£¨RS485/À¶ÑÀÄ£¿é£©
    {
       if(RS485orBT){//µ±RS485orBT±ê־λΪ1ʱÊÇRS485ģʽ£¬Îª0ʱÊÇÀ¶ÑÀģʽ
           USART2_RX_BUF[0]=USART2_NewData;//½«½ÓÊÕµ½µÄÊý¾Ý·ÅÈ뻺´æÊý×飨ÒòÖ»Óõ½1¸öÊý¾Ý£¬ËùÒÔÖ»´æ·ÅÔÚÊý¾Ý[0]λÖã©
           USART2_RX_STA++;//Êý¾Ý½ÓÊÕ±ê־λ¼Ó1
       }else{
           printf("%c",USART2_NewData); //°ÑÊÕµ½µÄÊý¾ÝÒÔ a·ûºÅ±äÁ¿ ·¢ËͻصçÄÔ
       }
       HAL_UART_Receive_IT(&huart2,(uint8_t *)&USART2_NewData, 1); //ÔÙ¿ªÆô½ÓÊÕÖжÏ
    }
    if(huart ==&huart3)//ÅжÏÖжÏÀ´Ô´£¨´®¿Ú3£ºWIFIÄ£¿é£©
    {
        printf("%c",USART3_NewData); //°ÑÊÕµ½µÄÊý¾ÝÒÔ a·ûºÅ±äÁ¿ ·¢ËͻصçÄÔ
        HAL_UART_Receive_IT(&huart3,(uint8_t *)&USART3_NewData,1); //ÔÙ¿ªÆô½ÓÊÕÖжÏ
    }
}
void UART_Send8Bits(uint8_t data) {
    HAL_UART_Transmit(&huart1, &data, 1, HAL_MAX_DELAY); // ×èÈûÖ±µ½·¢ËÍÍê³É
}

#include "Main_Run.h"
#include "Include_Main.h"
#include "Interrupt.h"

extern uint8_t DATA;
uint32_t dma_adc_buffer[1];


void Main_Run(void)
{
    HAL_UART_Receive_IT(&huart1, &DATA, 1);
    HAL_ADC_Start_DMA(&hadc1,dma_adc_buffer,1);
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET);
    while(1)
    {
        DATA =dma_adc_buffer[0]/16;
        HAL_UART_Transmit(&huart1, &DATA, 1,0xffff);
    }
}




```整个代码要实现发送数据和接收数据并写入DAC7311内进行转换。第一段代码是接收数据的主函数代码,进行DAC初始化后开启中断接收,在中断回调函数中处理数据并进行DAC转换,每次只接收一个字节数据,最后一段代码是发送数据的主函数,那程序设计有什么问题吗,改进后的代码是什么
  • 写回答

10条回答 默认 最新

  • 阿里嘎多学长 2024-07-21 11:29
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    您的代码是一个嵌入式系统项目,涉及到STM32微控制器的串口通信和DAC转换。在分析您的代码后,我注意到一些潜在的问题和改进点:

    1. 中断服务程序(ISR)中数据处理:HAL_UART_RxCpltCallback函数中,您直接将接收到的数据写入DAC。这可能在数据接收不稳定或错误时导致问题。建议增加错误检查和数据验证的逻辑。

    2. 数据缓冲区管理: 您的代码中似乎没有实现完整的缓冲区管理。在实际应用中,可能需要处理接收到的数据流,而不仅仅是一个字节。建议实现一个环形缓冲区来管理接收到的数据。

    3. DAC转换效率: 您的代码中,每次接收一个字节就进行一次DAC转换。这可能导致转换效率不高。可以考虑收集一定量的数据后再统一转换,或者使用DMA来提高效率。

    4. 代码模块化: 您的代码中有一些功能混合在主函数和其他函数中。建议将功能分离到不同的模块和函数中,以提高代码的可读性和可维护性。

    5. 同步和并发控制: 如果您的系统中有多个串口同时工作,可能需要考虑同步和并发控制,以避免数据冲突。

    6. 错误处理: 您的代码中缺少错误处理逻辑。建议在关键操作(如初始化、配置时钟等)后添加错误检查,并在发现错误时采取相应的措施。

    7. 系统时钟配置: 确保SystemClock_Config函数中的配置能够满足所有外设的时钟需求。

    8. 数据格式处理: 如果您的应用需要处理特定格式的数据(如十六进制),建议实现相应的转换函数。

    9. 代码可移植性: 避免硬编码,使用宏定义或配置文件来管理硬件相关的参数,以提高代码的可移植性。

    10. 测试和验证: 编写测试用例,对代码进行充分的测试,确保所有功能按预期工作。

    针对上述问题,以下是一些具体的改进建议:

    • 增加错误检查:HAL_UART_RxCpltCallback中,检查HAL_UART_Receive_IT的返回值,确保数据接收成功。
    • 实现环形缓冲区: 使用环形缓冲区来管理接收到的数据,避免数据丢失。
    • 使用DMA: 如果可能,使用DMA来传输数据到DAC,减少CPU的负载。
    • 分离功能代码: 将不同的功能代码分离到不同的函数中,使用清晰的函数命名和注释。
    • 同步机制: 如果有多个串口,考虑使用互斥锁或其他同步机制来保护共享资源。
    • 完善错误处理: 在关键操作后添加错误处理逻辑,确保系统稳定运行。
    • 优化时钟配置: 根据外设需求调整时钟配置,确保系统性能。

    请注意,这些只是基于您提供的代码片段的一些建议。实际的改进可能需要更深入的分析和测试。

    评论 编辑记录

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 7月21日
  • 创建了问题 7月21日