关于使用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;
}
}
正常数据
本站资源均来自互联网,仅供研究学习,禁止违法使用和商用,产生法律纠纷本站概不负责!如果侵犯了您的权益请与我们联系!
转载请注明出处: 免费源码网-免费的源码资源网站 » STM32串口DMA发送数据出现部分数据乱码
发表评论 取消回复