找回密码
 立即注册
查看: 86|回复: 9

DMA串口问题

[复制链接]
  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-08-01 05:15:21
已绑定手机

14

主题

36

回帖

116

积分

注册会员

积分
116
发表于 7 天前 | 显示全部楼层 |阅读模式
定义函数:

#define OK
#ifdef OK
void sendstring1(unsigned char * fmt, ...)
{va_list arg_ptr;va_start(arg_ptr, fmt);vsprintf(pu8UR1DMATxBuffer,fmt, arg_ptr);va_end(arg_ptr);
        DMA_UART1_ClearTxFlag();
        DMA_UART1_SetTxAmount(strlen(pu8UR1DMATxBuffer)-1);DMA_UART1_TriggerTx();
}
#else
void sendstring1(unsigned char * fmt, ...)
{va_list arg_ptr;va_start(arg_ptr, fmt);vsprintf(pu8UR1DMATxBuffer,fmt, arg_ptr);va_end(arg_ptr);
{unsigned char c=0;while((DMA_UART1_CheckTxFlag()==0)&&(c<200)){c++;delay_us(1000);};}
        DMA_UART1_ClearTxFlag();
        DMA_UART1_SetTxAmount(strlen(pu8UR1DMATxBuffer)-1);DMA_UART1_TriggerTx();
}
#endif

main中:

#ifdef OK
        sendstring1("abcd");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
        sendstring1("efgh");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
        sendstring1("ijkl\r\n");while(DMA_UART1_CheckTxFlag()==0);DMA_UART1_ClearTxFlag();
#else
        sendstring1("abcd");
        sendstring1("efgh");
        sendstring1("ijkl\r\n");
#endif

当宏定义为OK时,得到了我预期的效果:
当未定义oK时,发送顺序有问题:
代码附后
请大师指点!!!

正常顺序

正常顺序
发送顺序错误.PNG

aiComDma-07250.rar

346.92 KB, 下载次数: 1

回复

使用道具 举报 送花

3

主题

2108

回帖

-799

积分

等待验证会员

积分
-799
发表于 7 天前 | 显示全部楼层
关于DMA串口通信中sendstring1函数的定义问题,以下是对代码逻辑及潜在问题的专业分析与建议:

该函数旨在通过DMA方式发送字符串数据,其核心逻辑涉及可变参数处理、缓冲区操作及DMA触发。从代码结构看,函数采用条件编译(#ifdef OK)区分不同实现路径,其中若定义OK,则使用DMA方式进行数据传输;否则,采用轮询方式发送。

在#define OK分支中,函数首先通过valist和vsprintf将格式化字符串写入全局缓冲区pu8UR1DMATxBuffer。随后调用DMAUART1ClearTxFlag()清除DMA发送标志位,再通过DMAUART1SetTxAmount()设置待发送数据长度,并触发DMA传输。此流程符合DMA通信的基本逻辑,但需注意以下几点:

1. 缓冲区有效性:确保pu8UR1DMATxBuffer为全局或静态变量,且大小足够容纳目标字符串。若为局部变量,可能导致未定义行为。
2. 长度计算:strlen(pu8UR1DMATxBuffer)-1用于排除字符串结束符\0,但需确认vsprintf实际写入内容是否包含该字符。若未正确处理,可能导致发送数据不完整或错误。
3. DMA配置:需确保DMAUART1SetTxAmount()与DMA通道配置匹配,包括传输方向、数据宽度及缓冲区地址。若配置不当,可能引发DMA传输失败或异常。
4. 状态检查:DMAUART1CheckTxFlag()用于判断DMA是否完成,但在轮询模式下(#else分支),若未及时检查状态或超时处理,可能导致死循环或响应延迟。

在#else分支中,函数通过轮询方式逐字节发送数据,但代码存在语法错误:`while((DMAUART1CheckTxFlag()==0)&&(c

[本文内容由国芯人工智能辅助生成,仅供参考]
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2776

回帖

5716

积分

荣誉版主

无情的代码机器

积分
5716
发表于 7 天前 | 显示全部楼层

是否超时机制引发,干掉试下
截图202507250934558753.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-08-01 05:15:21
已绑定手机

14

主题

36

回帖

116

积分

注册会员

积分
116
发表于 7 天前 | 显示全部楼层
erci*** 发表于 2025-7-25 09:35
是否超时机制引发,干掉试下

跟前面我发的顺序不同的结果一样
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-08-01 05:15:21
已绑定手机

14

主题

36

回帖

116

积分

注册会员

积分
116
发表于 7 天前 | 显示全部楼层
我其实是想知道DMA方式下如何判断信息已经发出,如果没发出,就要等待,否则,就可以继续发。但是,非OK宏定义情况下,也确实要判断DMA_UART1_CheckTxFlag()的状态,不判断发出的是乱码。但是,增加了对DMA_UART1_CheckTxFlag()的判断后,发送的顺序变了,这个我实在搞不懂,希望都能得到支持!!
另外,增加一个变量计数,目的是为了防止第一次是0,如果是这样,等待一下就可以了,现在的方法是在主循环之外先发个信息,这个也无所谓。
现在主要是发送顺序问题,这个我实在搞不懂了。

aiComDma-07251.rar

347.6 KB, 下载次数: 3

点评

还有个问题,你应该等发完了再改变pu8UR1DMATxBuffer内容,不然别人正在发你改了不就乱了~  详情 回复 发表于 7 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2776

回帖

5716

积分

荣誉版主

无情的代码机器

积分
5716
发表于 7 天前 | 显示全部楼层
中书门*** 发表于 2025-7-25 21:13
我其实是想知道DMA方式下如何判断信息已经发出,如果没发出,就要等待,否则,就可以继续发。但是,非OK宏 ...

还有个问题,你应该等发完了再改变pu8UR1DMATxBuffer内容,不然别人正在发你改了不就乱了~
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2776

回帖

5716

积分

荣誉版主

无情的代码机器

积分
5716
发表于 7 天前 | 显示全部楼层

可以看看传统库函数例程包,有大量DMA示例
截图202507252134182689.jpg

截图202507252135037404.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-08-01 05:15:21
已绑定手机

14

主题

36

回帖

116

积分

注册会员

积分
116
发表于 7 天前 | 显示全部楼层
问题解决了,程序中先写入了pu8UR1DMATxBuffer,这个时候,发送缓冲区的内容变化了,然后才判断DMA是否结束,两条语句反过来就解决了。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:254
  • 最近打卡:2025-08-01 08:52:46
已绑定手机

78

主题

2776

回帖

5716

积分

荣誉版主

无情的代码机器

积分
5716
发表于 7 天前 | 显示全部楼层

建议养成好的编码习惯,不要代码挤在一行~~,不好看也不方便排错。
截图202507252136157627.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:常住居民III
  • 打卡总天数:136
  • 最近打卡:2025-08-01 05:15:21
已绑定手机

14

主题

36

回帖

116

积分

注册会员

积分
116
发表于 7 天前 | 显示全部楼层
erci*** 发表于 2025-7-25 21:37
建议养成好的编码习惯,不要代码挤在一行~~,不好看也不方便排错。

感谢指点。也许是我的习惯,这样可以看的内容更多些
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-1 11:24 , Processed in 0.128490 second(s), 104 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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