lixianda0527 发表于 2025-7-7 10:29:14

神农鼎 发表于 2025-7-7 10:21
设置10位===?STC8H8K64U, STC8H4K64TL, DMA 不支奇偶校验,只能8位数据位,无奇偶校验

要 DMA支持 奇偶校 ...

不是,我意思是DMA的接收缓存,DMA_UR1R_AMT = 9;这个

lixianda0527 发表于 2025-7-7 10:31:59

神农鼎 发表于 2025-7-7 10:21
设置10位===?STC8H8K64U, STC8H4K64TL, DMA 不支奇偶校验,只能8位数据位,无奇偶校验

要 DMA支持 奇偶校 ...
你看我发我数据,只要是数据个数对,就没问题,只要是漏发了一个数,后面再发对的接收也不对了



# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
11 22 33 44 55 66 77 88 99 01

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
11 22 33 44 55 66 77 88 99 01

# SEND HEX>
11 22 33 44 55 66 77 88 99

# SEND HEX>
11 22 33 44 55 66 77 88 99

# RECV HEX>
11 22 33 44 55 66 77 88 99 11

# SEND HEX>
11 22 33 44 55 66 77 88 99

# RECV HEX>
22 33 44 55 66 77 88 99 11 22

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
33 44 55 66 77 88 99 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33

# SEND HEX>
11 22 33 44 55 66 77 88 99 01

# RECV HEX>
44 55 66 77 88 99 01 11 22 33


乘风飞扬 发表于 2025-7-7 10:56:30

lixianda0527 发表于 2025-7-7 10:20
程序这样也不行

要用软件超时来处理数据,建议先用例子测试,功能验证正常后再进行修改或者移植。

C_wolf 发表于 2025-7-7 12:22:25

对于简单的程序,我一般是
设置个接收状态标志位和定时计数
接收到数据就置位标志位,并清零计数
计数超时,表示接收完成,清标志位
这个需要结合你的需求,看看适不适合

lixianda0527 发表于 2025-7-7 12:29:48

乘风飞扬 发表于 2025-7-7 10:56
要用软件超时来处理数据,建议先用例子测试,功能验证正常后再进行修改或者移植。 ...

就是意思是有超时处理,但是超时复位不了DMA,功能都正常,就是超时时间到了,DMA复位不了,然后还是一直等待,就是问问怎么样复位DMA的,也重新配置了,不行。

lixianda0527 发表于 2025-7-7 12:31:23

C_wolf 发表于 2025-7-7 12:22
对于简单的程序,我一般是
设置个接收状态标志位和定时计数
接收到数据就置位标志位,并清零计数


现在的问题是定时时间到,DMA复位不了,还是一直等待

C_wolf 发表于 2025-7-7 12:45:37

lixianda0527 发表于 2025-7-7 12:31
现在的问题是定时时间到,DMA复位不了,还是一直等待
我是用的普通串口通讯,所以说要看你的需求。

不过你这数据量也不大啊,需要DMA?

DMA有个寄存器DMA_URxR_DONE是不是可以修改,不知道能不能满足你的要求


这个串口DMA功能没有具体用过,只是猜测

lixianda0527 发表于 2025-7-7 13:19:27

C_wolf 发表于 2025-7-7 12:45
我是用的普通串口通讯,所以说要看你的需求。

不过你这数据量也不大啊,需要DMA?


这个也试了,协议短,但是频率高,无时无刻不在发送,115200的,只是我拿9600试的

C_wolf 发表于 2025-7-7 14:00:59

lixianda0527 发表于 2025-7-7 13:19
这个也试了,协议短,但是频率高,无时无刻不在发送,115200的,只是我拿9600试的 ...

可以的话,你把你的相关程序做的工程文件,体现出问题点,让其他高手帮你分析一下吧

乘风飞扬 发表于 2025-7-7 14:08:47

lixianda0527 发表于 2025-7-7 12:29
就是意思是有超时处理,但是超时复位不了DMA,功能都正常,就是超时时间到了,DMA复位不了,然后还是一直 ...

"先用例子测试,功能验证正常后再进行修改或者移植",这是最佳的捷径。
之所以这么建议,是因为从你9楼提供的代码截图里面,我依然没看到你使用超时标志进行判断。
例子里面的超时标志是"RX1_TimeOut",连续5ms没收到新的数据,判定一串数据接收完毕
。你好好研究一下例子这个机制是怎么实现的。
页: 1 [2] 3
查看完整版本: 请问DMA串口传输了不正确的长度,然后如何复位从头接收?