STM32串口DMA发送数据出现部分数据乱码

关于使用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;
	}
}

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

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值