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
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);
}
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);
}
}
你提到的两块板子之间的串口通信是基于 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。
如果在接收方板子中仍然无法正常接收到数据,还可以检查一下以下几点:
检查串口的波特率是否正确,确保发送方板子和接收方板子的波特率相同。
检查串口的其他参数是否正确,确保发送方板子和接收方板子的串口设置相同。
检查串口的连接是否正确,确保串口的 Tx 和 Rx 线路接在了正确的引脚上。
检查串口的硬件是否存在问题,如果串口的芯片或板子本身存在问题,也可能导致通信异常。
望采纳。
注意波特率,格式
1、确认串口参数初始化(波特率/停止位等),并使能串口。
2、确认使能串口和 GPIO 口时钟
3、确认GPIO 口初始化设置(速度,上下拉等)以及复用映射配置
详情你可参考下这篇实例【正点原子 STM32F4/F7水星 开发板资料连载第九章 串口通信实验】,讲解详细,步骤清晰,链接:https://zhuanlan.zhihu.com/p/154427510
可以按照下面的列表进行检查:
1、确认发送方与接收方的串口参数初始化配置相同。
2、确认使能串口,并且接收端使能串口中断,
3、确认串口的引脚以及RX TX连接正确,没有接错
4 利用串口上位机接收发送端发来的数据,确认发送端有没有问题
5 如果以上都没有问题的话,就可能是接收端出现了问题,接收端容易出问题的地方就是串口的使能以及中断的使能与处理
如果你使用的是HAL自有的中断函数,与终端流程则需要进行以下设置
1 在串口初始化中进行中断使能
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进行相应处理
中断函数会由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 个字节的数据。
希望这些建议能帮助您解决问题。
感觉你是把板子接错了引脚了
之前我们也是有块板子怎么调都调不通,后来发现把串口接到时钟引脚上去了
串口没数据,晶振不工作
串口有数据,晶振开始工作,于是接收到一堆乱码