请问两快STM32F4和F7板子串口之间通信问题

Baud Rate: 9600
Word Length: 8 Bits
Parity: None
Stop Bits: 1

一块板子发送8个bytes: 1,2,3,4,5,6,7,8 但另一块板子收到了: 127, 191, 247, 245, 243, 241, 239, 0

  1. STM32F767 每隔1秒发一次8 bytes 的数据
uint8_t Tx2_Data[8] = {0x1, 0x2, 0x3, 0x4, 0x5, 0x6, 0x7, 0x8};
while(1)
{
     HAL_UART_Transmit(&huart2, Tx2_Data, 8, 1000);
     HAL_Delay(1000);
}
  1. STM32F429 用中断来接收数据
uint8_t Rx3_Data[8*2];
    
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    
      if (huart->Instance == USART3)
      {
          rx3_data_ready = 1;
          HAL_UART_Receive_IT(&huart3, Rx3_Data, 8);
      }
}

img

你提到的两块板子之间的串口通信是基于 8N1 格式,也就是说它们使用了 8 位数据位,无奇偶校验位,1 位停止位的串口通信格式。

数据发送方板子的代码看起来没有问题,但是接收方板子的代码中存在一些问题。

可以先使用的是中断方式接收数据,在接收到数据时会调用 HAL_UART_RxCpltCallback 回调函数。在这个回调函数中,需要将接收到的数据处理完后再次调用 HAL_UART_Receive_IT 函数以继续接收数据。但是在代码中,只是将接收到的数据存储到了 Rx3_Data 数组中,并没有再次调用 HAL_UART_Receive_IT 函数。因此每次接收完数据后,接收方板子就不会再接收数据了。

正确的做法应该是,在回调函数中处理完接收到的数据后,再次调用 HAL_UART_Receive_IT 函数开启串口接收中断,以便继续接收数据。

具体来说,应该改写为如下代码:

uint8_t Rx3_Data[8];

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if (huart->Instance == USART3)
    {
        // 在这里处理接收到的数据
        // ……
        // 处理完数据后,再次开启串口接收中断
        HAL_UART_Receive_IT(&huart3, Rx3_Data, 8);
    }
}

此外在接收方板子的代码中使用的 Rx3_Data 数组大小为 8*2=16,但是在调用 HAL_UART_Receive_IT 函数时仍然使用的是 8 位数据位。如果希望接收方板子能够正常接收到数据,应该将 Rx3_Data 数组的大小改为 8。

如果在接收方板子中仍然无法正常接收到数据,还可以检查一下以下几点:

  1. 检查串口的波特率是否正确,确保发送方板子和接收方板子的波特率相同。

  2. 检查串口的其他参数是否正确,确保发送方板子和接收方板子的串口设置相同。

  3. 检查串口的连接是否正确,确保串口的 Tx 和 Rx 线路接在了正确的引脚上。

  4. 检查串口的硬件是否存在问题,如果串口的芯片或板子本身存在问题,也可能导致通信异常。
    望采纳。

注意波特率,格式

1、确认串口参数初始化(波特率/停止位等),并使能串口。
2、确认使能串口和 GPIO 口时钟
3、确认GPIO 口初始化设置(速度,上下拉等)以及复用映射配置
详情你可参考下这篇实例【正点原子 STM32F4/F7水星 开发板资料连载第九章 串口通信实验】,讲解详细,步骤清晰,链接:https://zhuanlan.zhihu.com/p/154427510

可以按照下面的列表进行检查:
1、确认发送方与接收方的串口参数初始化配置相同。
2、确认使能串口,并且接收端使能串口中断,
3、确认串口的引脚以及RX TX连接正确,没有接错
4 利用串口上位机接收发送端发来的数据,确认发送端有没有问题
5 如果以上都没有问题的话,就可能是接收端出现了问题,接收端容易出问题的地方就是串口的使能以及中断的使能与处理
如果你使用的是HAL自有的中断函数,与终端流程则需要进行以下设置
1 在串口初始化中进行中断使能

img

img

HAL_UART_Receive_IT(&UART1_Handler, (u8*)aRxBuffer, RXBUFFERSIZE);
aRxBuffer是定义的一个全局数组变量,RXBUFFERSIZE是定义的一个标识符:
#define RXBUFFERSIZE1
u8 aRxBuffer[RXBUFFERSIZE];

2 设置中断函数,可参考以下内容

调用HAL_UART_Receive_IT 函数后,除了开启接收中断外还确定了每次接收RXBUFFERSIZE个字符后标示接收结束从而进入回调函数HAL_UART_RxCpltCallback进行相应处理

img


可以看出,HAL_UART_RxCpltCallback 回调函数中没有必要对HAL_UART_Receive_IT 函数进行调用,直接对数据进行判断即可
这里有相关的函数运行流程

img

中断函数会由HAL UART IRQHandler自动调用HAL_UART_Receive_IT ,最终跳转至HAL_UART_RxCpltCallback 函数

如果您在使用 STM32F4 和 STM32F7 板子进行串口通信时遇到了问题,可能是因为串口配置不同导致的。建议您尝试以下措施:

确保两个板子的串口配置是完全一致的,包括波特率、数据位、奇偶校验和停止位。
检查 STM32F4 和 STM32F7 板子的串口硬件是否正常工作,例如是否存在线路或接插件问题。
在 STM32F4 板子的串口接收中断回调函数中,检查接收的数据是否正确。例如,您可以打印 Rx3_Data 数组中的内容,看看是否与 STM32F7 板子发送的数据一致。
4. 尝试在 STM32F4 板子的串口接收中断回调函数中打印出接收的数据的长度,看看是否与 STM32F7 板子发送的数据长度一致。

如果 STM32F4 板子的串口接收中断回调函数中的代码执行多次,可能是因为 STM32F7 板子发送的数据有误导致的。建议您检查 STM32F7 板子的串口发送代码,确保它正确地发送了 8 个字节的数据。
希望这些建议能帮助您解决问题。

  1. 首先分别用串口调试助手 和两个单片机通信确认每个单片机都没问题
    2链接两个单片机 进行通信如果不行注意两个单片机的工地问题

感觉你是把板子接错了引脚了
之前我们也是有块板子怎么调都调不通,后来发现把串口接到时钟引脚上去了
串口没数据,晶振不工作
串口有数据,晶振开始工作,于是接收到一堆乱码