找回密码
 立即注册
查看: 137|回复: 23

请问DMA串口传输了不正确的长度,然后如何复位从头接收?

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 7 天前 | 显示全部楼层 |阅读模式
比如设置DMA时传输10个字节,有一次实际只传输了9个这个错了可以抛弃,
但是DMA一直再等第十位的数据导致下一次数据传输正确却一直得不到正确的数据,
这也可以抛弃,但由于错位了导致一直接收不对,
这种如何复位接收?尝试了重新配置但也没什么效果。

截图202507061737134807.jpg




截图202507061737039706.jpg
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-07-12 08:36:49

755

主题

1万

回帖

1万

积分

管理员

积分
17826
发表于 7 天前 | 显示全部楼层
具体哪个型号的 MCU, 从哪往哪传 ?
我们好请研发来回答下
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 7 天前 | 显示全部楼层
神*** 发表于 2025-7-6 17:45
具体哪个型号的 MCU, 从哪往哪传 ?
我们好请研发来回答下

芯片型号STC8H4K64TL,
用的源代码是官网下载的STC8A8K64D4-SOFTWARE-LIB中的23-UART收发数据自动存入DMA-串口输出结果,
就是给DMA传输字节数改小了,然后直接发送就这样
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 7 天前 | 显示全部楼层
神*** 发表于 2025-7-6 17:45
具体哪个型号的 MCU, 从哪往哪传 ?
我们好请研发来回答下

代码里这样改了一下也不行
原来:
if((DmaTx1Flag) && (DmaRx1Flag))
                {
                  
                        DmaTx1Flag = 0;
                        DmaRx1Flag = 0;       
                        DMA_UR1T_TRIG();        //重新触发UART1发送功能
                        DMA_UR1R_TRIG();        //重新触发UART1接收功能
                       
                }

修改后
if((DmaTx1Flag) && (DmaRx1Flag))
                {
                        DmaTx1Flag = 0;
                        DMA_UR1T_TRIG();        //重新触发UART1发送功能

                       //关闭接收DMA,下次接收的数据重新存放在起始地址位置,否则下次接收数据继续往后面存放。
                        DMA_UR1R_CR = 0x00;                        //bit7 1:使能UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
                        DMA_UR1R_AMT = 9;                //设置传输总字节数:n+1
                        DMA_UR1R_RXA = DmaBuffer1;
                        DMA_UR1R_CR = 0xa1;                        //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
                        DmaRx1Flag = 0;       
                        DMA_UR1R_TRIG();        //重新触发UART1接收功能
                }
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-07-12 08:36:49

755

主题

1万

回帖

1万

积分

管理员

积分
17826
发表于 7 天前 | 显示全部楼层
STC8H4K64TL 请参照 STC8H8K64U实验箱的程序,
STC8A8K64D4是早期设计,还是有差异性的
截图202507061919336996.jpg
深圳国芯人工智能有限公司-实验箱

看最新 STC8H的数据手册,不要看 STC8A8K64D4的数据手册,有些不一样
https://www.stcaimcu.com/data/download/Datasheet/STC8H.pdf
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:465
  • 最近打卡:2025-07-12 12:17:45
已绑定手机

40

主题

2104

回帖

7263

积分

论坛元老

积分
7263
发表于 6 天前 | 显示全部楼层
可参考8H实验箱例程包里面例子:57-DMA-UART串口与存储器数据自动收发 / 串口1234使用DMA中断模式与电脑收发测试-串口1超时处理
早期芯片DMA没有硬件超时中断,这里的例子使用软件超时中断来实现接收一串数据后进行处理,然后重新开始接收下一串数据:
  1.                     //关闭接收DMA,下次接收的数据重新存放在起始地址位置,否则下次接收数据继续往后面存放。
  2.                     DMA_UR1R_CR = 0x00;                        //bit7 1:使能 UART1_DMA, bit5 1:开始 UART1_DMA 自动接收, bit0 1:清除 FIFO
  3.                     printf("\r\nUART1 Timeout!\r\n");  //UART1发送一个字符串
  4.                     UART1_DMA_Transmit(DmaBuffer1,RX1_Cnt);  //设置DMA发送缓冲区,数据长度,并启动发送
  5.                     RX1_Cnt = 0;
  6.                     DmaTx1Flag = 0;
  7.                     DmaRx1Flag = 0;
  8.                     UART1_DMA_Receive(DmaBuffer1,DMA_RX_LEN+1);  //设置DMA接收缓冲区,数据长度,并启动接收
复制代码
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 6 天前 | 显示全部楼层
乘风*** 发表于 2025-7-7 09:21
可参考8H实验箱例程包里面例子:57-DMA-UART串口与存储器数据自动收发 / 串口1234使用DMA中断模式与电脑收 ...

试了没用,是DMA寄存器关闭后它还是按照之前发的位数继续后面发,关闭重新配置也没有重置
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 6 天前 | 显示全部楼层
神*** 发表于 2025-7-6 19:19
STC8H4K64TL 请参照 STC8H8K64U实验箱的程序,
STC8A8K64D4是早期设计,还是有差异性的

这个程序也试了,DMA发送完成后切换XDATE地址也是一样,
可见DMA没法复位重新发送,就是想问问怎么让DMA复位的,
总不能让单片机软复位。
设置10位,只要有一次发送不是10位,后面发送正确,数据也不对了
截图202507071017086197.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:4
  • 最近打卡:2025-07-08 09:40:05
已绑定手机

4

主题

10

回帖

58

积分

注册会员

积分
58
发表于 6 天前 | 显示全部楼层
lixian*** 发表于 2025-7-7 10:17
这个程序也试了,DMA发送完成后切换XDATE地址也是一样,
可见DMA没法复位重新发送,就是想问问怎么让DMA复 ...

程序这样也不行
截图202507071020176142.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:125
  • 最近打卡:2025-07-12 08:36:49

755

主题

1万

回帖

1万

积分

管理员

积分
17826
发表于 6 天前 | 显示全部楼层
设置10位===?STC8H8K64U, STC8H4K64TL, DMA 不支奇偶校验,只能8位数据位,无奇偶校验

要 DMA支持 奇偶校验,换 STC32G8K64, STC32G12K128 系列
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-13 05:04 , Processed in 0.137025 second(s), 98 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表