CubeMx 串口问题

1、使用CubeMX直接生成底层代码开发起来非常方便,但遇到CubeMX自身有问题的时候,就让人调试的怀疑人生了!

使用CubeMX有一段时间了,之前主要使用STM32F103C8T6,STM32F030C8T6,STM32F030CCT6.一般使用一个串口用来通信,另外一个串口用来打印数据debug。所以属于1个接收,2个发送。接收函数是在uart.c中重写HAL_UART_RxCpltCallback实现的,程序一直挺稳定。没出现什么问题。最近有个需要2个串口同时收发的项目,同样使用CubeMX配置完成后直接生成代码,然后重写HAL_UART_RxCpltCallback函数。结果两个串口都异常了,发送都正常,接收开始的时候可以接收一些数据,然后就再也接收不到数据了,重启后依然是这样。于是各种调试,开始以为是自己程序中其他地方内存溢出或指针跑飞什么的造成的。于是重新配置CubeMX,生成一个新的工程,只有两个串口,并且每个串口,收到什么就发送什么,其他什么事情都不做。HAL_UART_RxCpltCallback如下:(里面两个Buf用于debug时看数据)结果发现现象一样,接收一些数据后就再也不进中断了。

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *UartHandle)

{

    if (UartHandle->Instance == USART1) // 

    {

      

      Rx1Buf[Rx1Get]=Rx1Receive;

      Rx1Get++;

      if(Rx1Get>=RX1_SIZE)Rx1Get=0;

      HAL_UART_Transmit(&huart1,&Rx1Receive , 1, 0xffff);  

      HAL_UART_Receive_IT(&huart1, &Rx1Receive, 1);//开启下一次接收

      

      

    }

    if (UartHandle->Instance == USART3) // 

    {

      Rx3Buf[Rx3Get]=Rx3Receive;

      Rx3Get++;

      if(Rx3Get>=RX3_SIZE)Rx3Get=0;

      HAL_UART_Transmit(&huart3,&Rx3Receive , 1, 0xffff);  

      HAL_UART_Receive_IT(&huart3, &Rx3Receive, 1);//开启下一次接收      

    }


}

然后一个串口一个串口的调试,又都正常,两个同时工作就不正常了。

有人遇到过这样的问题吗?肯定是接收这个地方的问题,但不知道应该怎么改才能正常工作!


2、使用STM32F103RCT6,用CubeMX配置好后,发现单独一个串口收什么发什么,结果用串口调试助手发送123,接收到是乱码,debug时看到接收到的数据已经不是123了。

怀疑是配置问题,但之前STM32F103C8T6就是这样配置的,所以在STM32F103C8T6上测试,正常。

怀疑是MCU坏掉了,然后找了个以前的lib库(STM32F10x Standard Peripherls Library Drivers)写了个串口程序,串口调试居然正常。

那么得到的结论是:CubeMX生成的针对STM32F103RCT6的串口程序有问题。

但很神奇的是STM32F103C8T6就没问题,同一个系列的会有什么差别呢?

有没有人用STM32F103RCT6成功过,推翻我的结论?

另外说明,同一个板子(STM32F103RCT6)使用lib库已经实现双串口同事收发,所以硬件是没有问题的。


已邀请:

看你

赞同来自:

遇到了和楼主一样的问题,之前用STMF103C8T6也没问题,但现在用STM32F105R8T6就出现上位机接收乱码的现象,求解!求解!

image.png

蒙蒙 - 90后 自学

赞同来自:

HAL_UART_Transmit(&huart1,&Rx1Receive , 1, 0xffff);   阻塞发送不推荐在串口中断中调用

 我怀疑你的中断优先级问题,中文字符的话需要两个byte才能正确显示,调试的时候推荐使用ASCII码测试

dzfree - dzfree

赞同来自:

这个问题你最后如何解决了呢?配置什么地方出现错误了呢,求指教


可以看一下主函数部分吗,我是发送数据,收不到数据。苦脑

爱睡觉

赞同来自:

我也有这个问题,一个串口就正常,2个就过一会收不到数了。求解

要回复问题请先登录注册