关于使用STM32 H7/F4 串口(485)DMA发送数据时,数据中会出现一部分乱码

情况:STM32使用串口DMA发送数据,出现数据部分乱码。

代码:


//485发送信息
void hal_Uart4_Send(char *str)
{
	//定义缓冲区
	uint8_t Data[512];
	//清空缓冲区
	memset(Data, 0, 512);
	
	sprintf((char *)Data, "%s", str);
	//拉高485使能引脚
	RS485_3_TX_EN;
	//开始发送数据
	HAL_UART_Transmit_DMA(&huart4, Data, strlen((char *)Data));
}

//DMA发送中断回调函数:DMA发送数据完成之后会进入此函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	//判断哪个串口发送完成
	if(huart == &huart4)
	{
		//拉低485使能引脚,继续接收数据
		RS485_3_RX_EN;
	}
}

数据接收端Debug查看接收到的数据:
在这里插入图片描述接收到的乱码数据

原因:程序跑得过快,导致DMA数据没有发送完毕,就被memset清空了缓冲区

解决方法:将Data定义为全局参数,将其放置在发送完毕之后;这样就是在数据发送完毕之后在清空缓冲区。

代码:

//定义缓冲区
static uint8_t Data[512];

//wifi发送信息
void hal_Uart4_Send(char *str)
{
	sprintf((char *)Data, "%s", str);
	
	//拉高485使能引脚
	RS485_3_TX_EN;
	//开始发送数据
	HAL_UART_Transmit_DMA(&huart4, Data, strlen((char *)Data));
	
}

//DMA发送中断回调函数:DMA发送数据完成之后会进入此函数
void HAL_UART_TxCpltCallback(UART_HandleTypeDef *huart)
{
	//判断哪个串口发送完成
	if(huart == &huart4)
	{
		memset(Data, 0, 512);//防止程序跑得过快,导致Data中的数据还没有被DMA发送完成就被memset,一部分数据变成乱码被发送
		//拉低485使能引脚,继续接收数据
		RS485_3_RX_EN;
	}
}

在这里插入图片描述正常数据

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部