嵌入式技术william hill官网
直播中

张涛

7年用户 1331经验值
私信 关注
[问答]

为什么用DMA发送串口数据时会出现数据覆盖的现象呢?

大神好。我在用DMA发送串口数据时会出现数据覆盖的现象

我用这种方式打开并配置串口DAM:

g_uart2obc = rt_device_find("uart1");
if(!g_uart2obc)
{
AWLOG_ERROR("can't find obc conn uart");
return -1;
}
struct serial_configure uart_config = RT_SERIAL_CONFIG_DEFAULT;
uart_config.baud_rate = 115200;
uart_config.bufsz = 4096;
if(RT_EOK != rt_device_control(g_uart2obc, RT_DEVICE_CTRL_CONFIG, &uart_config))
{
AWLOG_ERROR("config obc uart failed");
return -1;
}
if(RT_EOK != rt_device_open(g_uart2obc, RT_DEVICE_FLAG_DMA_RX|RT_DEVICE_FLAG_DMA_TX))
{
AWLOG_ERROR("open obc uart failed");
return -1;
}
return 0;

但是如果连续发送两个数据包就会出现第二个数据包被发出去,而第一个数据包没有被发出去的情况,代码:

rt_device_write(g_uart2obc, 0, buf1, length1); // 发送第一个数据包
rt_device_write(g_uart2obc, 0, buf2, length2); // 发送第二个数据包
如果发送两个数据包中间有延时那么两个数据包就都能被发送出去:

rt_device_write(g_uart2obc, 0, buf1, length1); // 发送第一个数据包
rt_thread_mdelay(5);
rt_device_write(g_uart2obc, 0, buf2, length2); // 发送第二个数据包

所以我推测是DMA底层代码的发送缓冲区资源分配的问题,导致数据被覆盖了

麻烦大神确认下这个问题,万分感谢!!!

回帖(1)

王玲

2023-1-10 18:18:52
现象分析
获取发送数据的返回值后,的确仍然可以改变发送值,无法确定是否发送完成导致的。

解决方式
注册 rt_device_set_tx_complete 功能,确定发送完成。

代码运行流程
发送第一条数据
等待发送完成产生的回调函数(使用信号量的话就是 release sem)
接收到回调消息,发送第二条数据
如此反复,即可使用 dma 情况下确保数据发送完成、不覆盖。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分