sync
sync
This guy hasn't written anything yet

注册于 2 years ago

回答
139
文章
3
关注者
3

你的打印函数在中断里面,如果本次没有打印完毕,又有新的中断发生,自然就会引起错误的,你可以跑下例子,看真正的数据内容错了没有,如果数据没错,就是你的程序流程问题,造成没有打印6字节了。

这是配置好的驱动,你当然不能自己想当然的修改了,你想实现啥功能呢?上面的uart_dma_sample 例子不能满足使用吗?

完整的数据不会错的,你的每帧长10字节,一旦出现接收4字节的情况(dma_isr),应该马上接收一个6字节才对(串口接收空闲中断),之所以没有打印出来,应该是程序执行的问题。具体看这个例子 里面的uart_dma_sample

使用dma方式接收时,drv_usart.c文件里面使用了3种中断模式
串口空闲中断,dma完成中断,以及dma完成一半中断
而dma接收使用的是循环模式
所以dma接收缓冲区一旦满了或者接收一半时,就会进入dma_isr里面的,而此时串口空闲中断并不一定才生,因此就会造成这个现象了。

数据应该是不会错的,只是楼主打印的位置不对。
参看这里的例子
打印下dma接收到的内容,应该只是分包显示了,数据不会错的

关注下,目前dma接收是循环模式,所以肯定会有打断的数据包的。

如果想方便的使用串口空闲中断+串口dma接收任意长度的数据帧,应该设置
DMA_Handle->Init.Mode = DMA_NORMAL;
然后每次帧接收完毕后,重新开启下dma接收即可
if (HAL_UART_Receive_DMA(&(uart->handle), rx_fifo->buffer, serial->config.bufsz) != HAL_OK)
{
/* Transfer error in reception process */
RT_ASSERT(0);
}

freemodbus里面用的就是定时器判断帧超时的,自己看看吧

这个不算频繁了,如果中断程序很短,就找找其他原因吧,不会是单纯的中断导致adc线程无法执行的

你这不仅是中断频繁吧?中断里面执行的时间也长吧?时序问题必须要自己规划好了

楼主是只下载了bootloader,所有其他分区都是空的,自然校验失败了

这些都不需要我们考虑了,直接用就是了,详细看这里

还没想好 发表于 2019-3-9 20:21
如果是挂两个 lfs,可能是 RT_DEF_LFS_DRIVERS 的值为 1,导致挂两个 lfs 挂不上去。

楼主可以检查一下 ...


太感谢了,我也遇到这个问题了,RT_DEF_LFS_DRIVERS =2,就可以挂载两个lfs文件系统了

回到
顶部

发布
问题

投诉
建议