箐11 2024-02-02 17:17 采纳率: 40%
浏览 36
已结题

串口助手发送数据失败 stm32

为什么系统向上位机可以发送数据,但是上位机发送命令串口确没有反应
串口配置:

void MX_USART1_UART_Init(void)
{

  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  huart1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
  huart1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
  huart1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetTxFifoThreshold(&huart1, UART_TXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_SetRxFifoThreshold(&huart1, UART_RXFIFO_THRESHOLD_1_8) != HAL_OK)
  {
    Error_Handler();
  }
  if (HAL_UARTEx_DisableFifoMode(&huart1) != HAL_OK)
  {
    Error_Handler();
  }

}

串口接收回调函数:

uint8_t Rx_dat[16];
uint8_t str1[50];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance==USART1)
        {
            if(Rx_dat[0] == 0xBF && Rx_dat[2] == 0xFB)
        {
            switch(Rx_dat[1])
            {
                case 0xa1:
                    LED2_ON;
                    sprintf((char *)str1,"%d:%d:%d    LED2打开!\r\n",hh,min,sec);
                break;
                
                case 0xa2:
            LED2_OFF;
            sprintf((char *)str1,"%d:%d:%d    LED2关闭!\r\n",hh,min,sec);
        break;
                
            default:
            sprintf((char *)str1,"%d:%d:%d    这是一个错误的命令!\r\n",hh,min,sec);
        break;
        }
            
            HAL_UART_Transmit(&huart1,str1,sizeof(str1),10000);
        HAL_UART_Receive_IT(&huart1,Rx_dat,3);
        }
        

        }
}

main函数:


LCD_Init();
  LCD_SetBackColor(Black);
    LCD_Clear(Black);
    LCD_SetTextColor(White);
    HAL_GPIO_WritePin(GPIOC,GPIO_PIN_All,GPIO_PIN_SET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET);
    LED_Check();
    char tep[] = "XMF07欢迎你!\r\n";
    HAL_UART_Transmit(&huart1, (uint8_t*)tep,sizeof(tep), 100); 
    HAL_TIM_Base_Start_IT(&htim2);

 

  /* USER CODE END 2 */

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

    /* USER CODE BEGIN 3 */
            HAL_UART_Receive_IT(&huart1,Rx_dat,3);
        
  }
  /* USER CODE END 3 */

串口助手:

img

  • 写回答

3条回答 默认 最新

  • 专家-郭老师 Java领域新星创作者 2024-02-02 17:18
    关注

    参考通义千问和郭老师的小迷弟雅思莫了-编写提供,主要是为了帮助您快速解决问题,如下回答,您可以参考下,如有问题,评论区留言。

    从您提供的代码片段来看,STM32的USART1串口配置和初始化是正确的,也设置了接收中断,并在接收完成回调函数中处理了接收到的数据。但是,上位机发送命令后STM32没有反应可能有以下几个原因:

    1. 通信协议不匹配:检查上位机(串口助手)设置的波特率、数据位数、停止位、校验方式是否与STM32配置一致,例如都是9600波特率,8位数据,无校验,1位停止位。

    2. 命令帧格式问题:根据您的回调函数逻辑,STM32只对特定格式的命令进行响应(如开始字节为0xBF,第二个字节为命令标识等)。确保上位机发送的命令符合这个格式要求。

    3. 接收中断未触发:确认HAL_UART_Receive_IT(&huart1, Rx_dat, 3); 是否能正常触发中断。检查NVIC中断设置,确保USART1的RX中断使能。

    4. 回调函数执行问题

      • 确保HAL_UART_RxCpltCallback函数被正确调用,即接收中断服务程序中正确调用了该回调。
      • 检查HAL_UART_Transmit函数是否成功发送应答信息,虽然您设置了超时时间10000,但如果在此期间发生其他错误(如DMA配置不当),可能导致发送失败。
    5. 硬件连接问题:检查USART1的TX/RX线路上下拉电阻、线路连接是否可靠,是否存在信号干扰等问题。

    建议在排查过程中使用示波器或逻辑分析仪检查实际的串行通信数据流,以确定问题所在。同时,在回调函数或其他关键位置加入调试打印,查看运行状态,有助于定位问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月3日
  • 已采纳回答 2月3日
  • 创建了问题 2月2日

悬赏问题

  • ¥15 安霸cv22 + rtl8211f 千兆,udp传输丢包
  • ¥15 关于区块链和边缘环境搭建的相关问题
  • ¥15 windows远程桌面断卡重连软件卡顿问题
  • ¥30 Unity 实现扫描效果
  • ¥15 HbuilderX检测不到安卓模拟器
  • ¥15 这个main已经在filename.obj中定义是什么错 C语言
  • ¥15 关于#linux#的问题:exsi8.0系统 怎么更改web访问端口,不用80、443
  • ¥15 使用elementor设计样式
  • ¥15 谁能提供一个中文版的推销咨询网站连接?
  • ¥15 springboot项目程序启动报错