找回密码
 立即注册
楼主: lixianda0527

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

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

4

主题

10

回帖

70

积分

注册会员

积分
70
发表于 2025-7-7 14:46:39 | 显示全部楼层
乘风*** 发表于 2025-7-7 14:08
"先用例子测试,功能验证正常后再进行修改或者移植",这是最佳的捷径。
之所以这么建议,是因为从你9楼提 ...

试过了,只是代码没有贴出来,现在不是超时问题,问题是超时完了需要处理,处理无效的问题,不讲超时了,直接让处理代码运行都无效,这和超时不超时没什么关系,代码原封不对都存在这样的问题,官方的那个9.6的试验箱里的DMA代码也试了,一样的问题,要不然也不会问了
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:634
  • 最近打卡:2026-03-06 13:57:21
已绑定手机

52

主题

2464

回帖

8728

积分

论坛元老

积分
8728
发表于 2025-7-7 16:07:36 | 显示全部楼层
看看例子运行效果确认行不行
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:491
  • 最近打卡:2026-03-07 10:40:30
已绑定手机

14

主题

228

回帖

2766

积分

金牌会员

积分
2766
发表于 2025-7-7 16:25:25 | 显示全部楼层
lixian*** 发表于 2025-7-7 14:46
试过了,只是代码没有贴出来,现在不是超时问题,问题是超时完了需要处理,处理无效的问题,不讲超时了, ...

按照22楼的视频 看来,
应该是在接收超时后再判断数据正确性,
你是不是收了就发啊,感觉还是程序逻辑上问题
回复

使用道具 举报 送花

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

4

主题

10

回帖

70

积分

注册会员

积分
70
发表于 2025-7-8 09:40:05 | 显示全部楼层
C_w*** 发表于 2025-7-7 16:25
按照22楼的视频 看来,
应该是在接收超时后再判断数据正确性,
你是不是收了就发啊,感觉还是程序逻辑上 ...

不是,用的芯片不一样,我用的是STC8H4K64TL,直接用那个9.6的程序只有串口3能用(串口2没接,接了串口134),我是按照思路配置了一下串口3不行,然后用的STC8A8K64D4的例程(串口134都能用),然后把9.6代码串口1的搬过来,复位不了,然后我又看手册自己配置也复位不了
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2026-03-07 00:32:56
已绑定手机

3

主题

12

回帖

71

积分

注册会员

积分
71
发表于 2025-7-30 19:20:51 来自手机 | 显示全部楼层
串口DMA接收, 我也遇到了 只要发错一次数据个数,后面就没得玩了,一直是错位的!
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2026-03-07 00:32:56
已绑定手机

3

主题

12

回帖

71

积分

注册会员

积分
71
发表于 2025-7-30 21:18:29 | 显示全部楼层
搞了两天 ,今晚看了一下手册,  试了一下这样可以重启了!
void UART2_DMA_dodo(void)
{
                DMA_UR2R_CR &= ~(1 <<7);

                memset(pu8UR2DMARxBuffer, 0, 16);
            //重新使能DMA并触发接收(从起始位置开始)
                DMA_UR2R_CR |= (1 <<7);  // 置位B7(ENUR2R=1,重新使能DMA)
            DMA_UR2R_CR |= (1 <<5);  // 置位B5(TRIG=1,触发新一轮接收)
        //DMA_UR2R_CR |= 0x01;
}
   试了一下,
重启真的可以了

点评

您好,您这个做法可以解决之后接收的问题,那么第一帧地址不对,如何解决的?  发表于 2026-2-10 09:09
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2026-02-10 09:08:23
已绑定手机

0

主题

2

回帖

64

积分

注册会员

积分
64
发表于 2026-2-10 09:09:08 | 显示全部楼层
ssf*** 发表于 2025-7-30 21:18
搞了两天 ,今晚看了一下手册,  试了一下这样可以重启了!
void UART2_DMA_dodo(void)
{

我遇到了更奇葩的问题。单独使用DMA功能没问题,如果把其他任务程序都加上。DMA启动后,接收第一帧,地址就是不对,之后重新使能才能好用。这STC8H8K单片机都是奇怪问题呀

点评

推荐参考 STC8H8K64U范例程序 下载链接: https://www.stcaimcu.com/data/download/DemoCode/STC8H8K64U-DEMO-CODE-V9.6.zip [attachimg]131752[/attachimg][attachimg]131751[/attachimg]  详情 回复 发表于 2026-2-10 09:51
回复

使用道具 举报 送花

  • 打卡等级:常住居民I
  • 打卡总天数:62
  • 最近打卡:2026-03-06 11:14:21

46

主题

295

回帖

2657

积分

超级版主

积分
2657
发表于 2026-2-10 09:51:22 | 显示全部楼层
垚*** 发表于 2026-2-10 09:09
我遇到了更奇葩的问题。单独使用DMA功能没问题,如果把其他任务程序都加上。DMA启动后,接收第一帧,地址 ...


推荐参考 STC8H8K64U范例程序
下载链接:
https://www.stcaimcu.com/data/download/DemoCode/STC8H8K64U-DEMO-CODE-V9.6.zip

截图202602100951121517.jpg 截图202602100949237432.jpg
QQ:3398500488
微信号:18106296592(小刘)
回复

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:177
  • 最近打卡:2026-03-07 00:32:56
已绑定手机

3

主题

12

回帖

71

积分

注册会员

积分
71
发表于 2026-2-15 07:12:42 | 显示全部楼层
ssf*** 发表于 2025-7-30 21:18
搞了两天 ,今晚看了一下手册,  试了一下这样可以重启了!
void UART2_DMA_dodo(void)
{

你好,DMA我只使用发送功能,接收用的常规串口中断接收,使用定时器1毫秒做的接收超时处理,而且我的是485通讯,有数据帧头判断。你看下是否有参考价值。
/**
  * @brief  串口超时清除处理函数
  * @note   1ms 定时器中断中调用,负责清除不完整的串口接收帧
  * @param  无
  * @retval 无
  */
void Uart_Timeout_Clear(void)
{
        // 在定时器中断里进行串口异常数据清除处理
        /* 串口接收中断入口置位,数据接收使能超时计数 */
        if( uart_1_Rx_Tx_ok & Rx_ok )  
         {       
                 if(uart_timer>0)
                        {
                                uart_timer--;
                        }  else
                           {
                        //串口超时处理          
                                /* 关闭超时计数开关 */          
                                 uart_1_Rx_Tx_ok &= ~Rx_ok;
                                 comm_n_buf_len = 0;
                                 buf_A[0] = 0;
                             buf_B[0] = 0;  
                               
                                 uart_1_Rx_len = 0;
                                 uart_1_Rx_buffer[0] = 0;
                                 uart_1_Rx_buffer[1] = 0;                             
                                }                           
         }
}


/* UART中断服务函数 */
void Uart1_Isr(void) interrupt 4
{                                    
        if (RI)                                //检测串口1接收中断
        {
                RI = 0;                        //清除串口1接收中断请求位                                  
                uart_1_Rx_Tx_ok = Rx_ok;  //进入串口接收,使能接收超时
                /* 特别注意中断优先级以及数据判断复制时间问题 */
                uart_timer = 1; //串口接收超时设置单位(毫秒)
                /**********************************************/       
                if(uart_1_Rx_len<8)  //接收长度限制 当前固定为一帧 8 字节
                {
                if(uart_1_Rx_len==0) //获取数据帧头
                {
                  buf[0] = SBUF;
                  buf_ok_fila = 0;
                } else
                  {
                    buf[1] = SBUF;
                  }
                 uart_1_Rx_len++;                   
           } else /* 接收长度异常时 */
          {
                         uart_1_Rx_len=0;
                     uart_1_Rx_Tx_ok = Rx_ok;  //数据错误,使能超时       
                         buf[0] = 0;
             buf[1] = 0;                           
                  }                  
                  if(flags != 7)
                        {                                            
                if((buf[0]== 0x03) || (buf[0] == 0x06)) //帧头正确,数据写入缓冲区
                {      
                  if(buf_ok_fila==0)       
                  {               
                         buf_ok_fila = 1;  
                          // 缓冲区写数据
                     Rx_write_n_buf(&buf[0],&uart_1_Rx_Tx_ok);
                  } else
                    {
                          Rx_write_n_buf(&buf[1],&uart_1_Rx_Tx_ok);
                        }                        
                 }
        else  /* 帧头异常处理*/
           {   
                     uart_1_Rx_Tx_ok = Rx_ok;  //数据错误,使能超时                            
                         buf[0] = 0;
             buf[1] = 0;                            
                   }                  
                     }
                               
                   if(uart_1_Rx_len>=8)   
                   {
                           uart_1_Rx_len = 0;
                       buf[0] = 0;
               buf[1] = 0;
                   }         
        }
}
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2026-3-7 17:05 , Processed in 0.130767 second(s), 94 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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