DMA的串口通信疑问
本帖最后由 飞捷 于 2023-12-18 11:36 编辑DMA的串口通信过程中,如果DMA在接收数据,因为是modbus 协议,我无法知道上位机会发送多少个数据过来,一般我们都是设置可接收256个数据,但是上位机只发送了14数据,也可能30个数据,我是通过检测接收数据的数量在10MS内没变化,就说明接收完成,这时我就取这些数据去处理,但是距离接收完256个字节还远远不到,这时个疑问:
1.假如已经接收了30个数据,如果下次上位机再次发送,是否会从数组的第31个数据继续存进去?
2.怎么样才能每次接收都 是从第一个数据存起?
3.如果接收不到256个数据,DMA会不会继续等?
4.看了DMA的视频课程,里面有说到FIFO,这个指针能否由程序员自已设定?
以前是用普通的串口通信,现在改为DMA模式,发现新增的问题,就是9位数据传输过程 ,如何发送第9位数据 ,需要奇 偶校验这些?
发现DMA串口通信,超时中断的例程只有STC8H有,而STC32G没有?
然后STC8H例程里面传输总字节寄存器 DMA_UR2T_AMT(8位) 而STC32G 是分高低字节 DMA_UR2T_AMTL 和DMA_UR2T_AMTH 加起来是16位,是不是STC32G最大可支持65536个字节传输?
STC8H头文件是DMA_UR2T_TXA(代表16位)然后DMA_UR2T_TXAL和DMA_UR2T_TXAH也分别定义了,可供用户自已选择。但是STC32G只有定义 DMA_UR2T_TXAL和DMA_UR2T_TXAH,没有定义DMA_UR2T_TXA(代表16位)?为什么会不一样?有讲究吗?
一个思路是开启串口接收中断,在接收中断中使用定时器做超时处理。如果是串口有超时中断的片子,就直接中串口超时中断来分包就行,
在定时器中断中读取一下接收的字节数然后再开启DMA接收。。这样就做了一个DMA串口的不定长接收。。当然简单的用一次接收的长度最大不能超过256。
具体的可以在软件资源里面找STC8H64U这个单片机试验箱的参考历程 看了那个历程基本就可以解决 1. 2. 3. 的问题
4.还是等大佬来解答吧 cofmilk 发表于 2023-12-16 18:48
一个思路是开启串口接收中断,在接收中断中使用定时器做超时处理。如果是串口有超时中断的片子,就直接中串 ...
再开启是指再使能,还是? 因为我设置了256个字节,都还没有接收完毕中啊?
cofmilk 发表于 2023-12-16 18:51
看了那个历程基本就可以解决 1. 2. 3. 的问题
4.还是等大佬来解答吧
我就是看了例程 引发的疑问,因为例程直接设置了接收256个字节,然后就DMA中断了。所以产生了前三个问题,最后问题4是看了视频,大佬在讨论这个FIFO引出来的思考 cofmilk 发表于 2023-12-16 18:49
具体的可以在软件资源里面找STC8H64U这个单片机试验箱的参考历程
例程只介绍设置接收256个字节就发生中断,并没有介绍设置256,然后假如只收20个数据,之后如何重新再返回从头开始存数据。 飞捷 发表于 2023-12-17 22:29
再开启是指再使能,还是? 因为我设置了256个字节,都还没有接收完毕中啊?
...
要注意的是 判断是否接收完毕的不是DMA中断,,而是定时器中断。
在开启指的是再配置一遍DMA 飞捷 发表于 2023-12-18 08:22
例程只介绍设置接收256个字节就发生中断,并没有介绍设置256,然后假如只收20个数据,之后如何重新再返回 ...
你要看那个不定长接收的例程,,然后怎么设置DMA接收字节数 你要看手册里的介绍 cofmilk 发表于 2023-12-18 08:53
要注意的是 判断是否接收完毕的不是DMA中断,,而是定时器中断。
在开启指的是再配置一遍DMA ...
看到了,通过定时器5毫秒,关闭接收使能,再开启使能。