各位大神好:
首先谢谢后台小哥,我的账号终于可以登陆论坛了。 最近在调试UART DMA 模式下数据传输程序,发现一个问题,DMA 缓存设置5120字节。上位机每隔4s要发送1024字节数据到板子上。板子接收到后,通过控制台串口打印出来,发现接收数据有时候完整,有时候不完整。看了驱动源码,DMA工作在环形模式下,请问这是什么地方出问题了?谢谢。如果数据一两百个字节,接收正常。
首先谢谢后台小哥,我的账号终于可以登陆论坛了。
最近在调试UART DMA 模式下数据传输程序,发现一个问题,DMA 缓存设置5120字节。上位机每隔4s要发送1024字节数据到板子上。板子接收到后,通过控制台串口打印出来,发现接收数据有时候完整,有时候不完整。看了驱动源码,DMA工作在环形模式下,请问这是什么地方出问题了?谢谢。如果数据一两百个字节,接收正常。
查看更多
环形模式下为了防止数据溢出导致接收数据被覆盖,所以使用了接收半满中断,数据会分包你发送的是定长数据,长度不够时做一次分包处理发送数据不定长时,根据间隔时间做分包处理
这是分包问题造成的吗?
屏蔽了void HAL_UART_RxCpltCallback(UART_HandleTypeDef huart){ / struct rt_serial_device serial; struct stm32_uart uart; rt_size_t recv_len; rt_base_t level;
RT_ASSERT(huart != NULL);uart = (struct stm32_uart *)huart;serial = &uart->serial;level = rt_hw_interrupt_disable();recv_len = serial->config.bufsz - uart->dma.last_index;uart->dma.last_index = 0;rt_hw_interrupt_enable(level);if (recv_len){ rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));}*/
RT_ASSERT(huart != NULL);
uart = (struct stm32_uart *)huart;
serial = &uart->serial;
level = rt_hw_interrupt_disable();
recv_len = serial->config.bufsz - uart->dma.last_index;
uart->dma.last_index = 0;
rt_hw_interrupt_enable(level);
if (recv_len)
{
rt_hw_serial_isr(serial, RT_SERIAL_EVENT_RX_DMADONE | (recv_len << 8));
}
*/
}暂时不会出现中途分包情况,但是会出现0包和满包情况。
环形模式下为了防止数据溢出导致接收数据被覆盖,所以使用了接收半满中断,数据会分包你发送的是定长数据 …
谢谢,谢谢。
您好 请问DMA 缓存设置5120字节 这个是在哪设置的?
欢迎发表与嵌入式相关的技术分享、开发技巧、工具介绍、技术设想、职业心得、行业评论等对他人有启发,排版优雅的文章
回到 顶部
发布 问题
分享 好友
手机 浏览
投诉 建议
回到 底部
可是我觉得这个不合理,我尝试使用UART-DMA接收,设置缓存4096,那照您的意思就是到2048就会猝发中断,最后一个接收包就会被分割成两次接收。我觉得会造成麻烦。一般来说没系统状态,DMA空闲中断来接收,接收到,把DMA接收地址复位就可以了,这个可以保证每次都接收到1个包,而非两个。如果设置成UART-DMA,除非在定长接收包状态比较有利,如果不定长那么就会增加很多包判断机制。
非常感谢你的建议,以前玩裸机的时候串口接收使用的空闲中断+DMA的方式,效果是非常理想的。我提供的建议只是在不修改RTT的驱动程序,直接在应用层去实现的方法,针对不同的需求有不同的方法