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

4组串口UART使用DMA收发 @32G系列,易用,高效,稳定 !精品实战代码

  [复制链接]
  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-12-2 08:19:52 | 显示全部楼层
tzz1*** 发表于 2023-12-1 22:23
你即然研究过了, 那肯定知道可变参数的传递规则了, 不知道的话再百度一下, 就可以知道了. 传递参数搞定
至 ...

C51 中, 传递可变参数 占用固定的存储器地址, 中小模式下为 15字节, 大模式下为 40字节,

因为是 占用固定的存储器地址, 所以不能用这种方法, 否则,  函数就变成和原先一样, 不可重入的了.

如将全部参数 压栈 吧, C51 的堆栈太小了, 不节省点不够用, 堆栈溢出程序跑飞, 这是不愿意看到的现像.

现在我用的方法是用宏定义, 将参数分开, 一个一个的读入调用转换成格式化数据写入缓冲区.

以尽量减轻堆栈压力.
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:455
  • 最近打卡:2025-06-10 13:10:51
已绑定手机

236

主题

340

回帖

1698

积分

金牌会员

积分
1698
发表于 2023-12-2 08:40:19 | 显示全部楼层
LAO*** 发表于 2023-11-30 14:49
两位大师, 帮忙看看, 如何解决不同类型的数据, 统一转换成 long类型.

对 char, int, long, 指针类 p, 都可 ...

用共用体

X]QG1R38%DW_(8U715B%0[5.png

回复

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:312
  • 最近打卡:2025-03-11 13:20:13

54

主题

1323

回帖

5505

积分

荣誉版主

积分
5505
发表于 2023-12-2 10:11:27 | 显示全部楼层

谢谢回复,

共用体这里用不上, 我的主要目的是为了解决 printf  (const char *, char *);函数, 格式化字符串和附加的参数, 不通过内部固定存储器传输问题.(因为通过内部固定存储器传输, printf 函数就变成不可重入了, 和原先一样)
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:53
  • 最近打卡:2025-07-15 09:30:35

4

主题

44

回帖

140

积分

注册会员

积分
140
发表于 2024-1-20 10:45:39 | 显示全部楼层
我来学习的~  讨论的很精彩~
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:615
  • 最近打卡:2025-08-23 08:47:11

21

主题

567

回帖

3164

积分

论坛元老

积分
3164
发表于 2024-1-20 20:59:50 | 显示全部楼层
QQ6243*** 发表于 2023-11-28 19:39
这些情况我都考虑全了,没有问题
首先发送的数据包是在pdata中,pdata只用来存零时数据包,数据包长度不超 ...

老哥能分享一下你的代码吗
回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-03-10 16:08:45

6

主题

131

回帖

666

积分

高级会员

积分
666
发表于 2024-1-30 22:15:41 | 显示全部楼层
本帖最后由 13918210822 于 2024-1-30 22:25 编辑

请问是否需要打开DMA超时才能通过DMA正确接收不定长的串口数据?
如果目前这样的方式, 是否要加一个环缓冲才能保证不覆盖?

/*---------------------------------------------------------
DMA_UART1RX中断
----------------------------------------------------------*/
void DMA_UART1RX_ISR_Handler(void) interrupt DMA_UR1R_VECTOR  
{
    DMA_UR1R_STA = 0;   //清除中断标志
    DMA_UR1R_CR = 0XA1; //开DMA接收
}

点评

目前的代码就是环缓冲不断覆盖自身, 要在数据覆盖前读出数据. 通过查询DMA传输数量间接获得接收字节数. 只要设置适当的缓冲环大小和查询时间间隔就可以保证数据在覆盖前被读出. 比如波特率9600时,大约1毫秒1字节,  详情 回复 发表于 2024-1-31 09:49
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-08-14 10:33:10

34

主题

1123

回帖

2636

积分

荣誉版主

积分
2636
发表于 2024-1-31 09:49:58 | 显示全部楼层
139182*** 发表于 2024-1-30 22:15
请问是否需要打开DMA超时才能通过DMA正确接收不定长的串口数据?
如果目前这样的方式, 是否要加一个环缓冲才 ...

目前的代码就是环缓冲不断覆盖自身, 要在数据覆盖前读出数据.
通过查询DMA传输数量间接获得接收字节数. 只要设置适当的缓冲环大小和查询时间间隔就可以保证数据在覆盖前被读出.
比如波特率9600时,大约1毫秒1字节,  20毫秒查询间隔, 40节字(翻一倍) 接收缓冲环就足够.  
数据包的分隔是通过数据议来区分的,比如帧头等, 这种应用很多,暂时未加入任何数据包协议.
回复

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:13
  • 最近打卡:2025-02-03 07:57:31

6

主题

10

回帖

112

积分

注册会员

积分
112
发表于 2024-2-22 09:38:54 | 显示全部楼层
终于找到用法简单的了,谢谢博主!!!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:495
  • 最近打卡:2025-08-23 08:37:27

12

主题

319

回帖

2385

积分

金牌会员

积分
2385
发表于 2024-2-22 11:23:12 | 显示全部楼层
下载学习下,谢谢楼主分享!
回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:507
  • 最近打卡:2025-08-24 00:13:30
已绑定手机

17

主题

732

回帖

1685

积分

金牌会员

积分
1685
发表于 2024-3-21 07:48:00 | 显示全部楼层
官方代码代码只保证实现功能,在实际应用中,还需要自己做一些稳定性措施
回复

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-8-24 04:04 , Processed in 0.124808 second(s), 102 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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