找回密码
 立即注册
楼主: tzz***

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

[复制链接]
  • TA的每日心情
    开心
    昨天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    873

    回帖

    3992

    积分

    荣誉版主

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

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

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

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

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

    以尽量减轻堆栈压力.
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    郁闷
    1 小时前
  • 签到天数: 152 天

    [LV.7]常住居民III

    138

    主题

    191

    回帖

    1636

    积分

    金牌会员

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

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

    用共用体

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

    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    开心
    昨天 03:18
  • 签到天数: 137 天

    [LV.7]常住居民III

    37

    主题

    873

    回帖

    3992

    积分

    荣誉版主

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

    谢谢回复,

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

    使用道具 举报

  • TA的每日心情
    开心
    2024-4-17 10:39
  • 签到天数: 35 天

    [LV.5]常住居民I

    2

    主题

    40

    回帖

    46

    积分

    新手上路

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2 小时前
  • 签到天数: 161 天

    [LV.7]常住居民III

    12

    主题

    341

    回帖

    1084

    积分

    金牌会员

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

    老哥能分享一下你的代码吗
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    4

    主题

    61

    回帖

    298

    积分

    中级会员

    积分
    298
    发表于 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
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    19

    主题

    526

    回帖

    1654

    积分

    荣誉版主

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

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-3-16 14:51
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    4

    主题

    5

    回帖

    58

    积分

    注册会员

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

    使用道具 举报

  • TA的每日心情
    开心
    前天 15:02
  • 签到天数: 123 天

    [LV.7]常住居民III

    12

    主题

    315

    回帖

    878

    积分

    高级会员

    积分
    878
    发表于 2024-2-22 11:23:12 | 显示全部楼层
    下载学习下,谢谢楼主分享!
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    慵懒
    前天 02:02
  • 签到天数: 68 天

    [LV.6]常住居民II

    4

    主题

    414

    回帖

    1122

    积分

    金牌会员

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

    使用道具 举报

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

    本版积分规则

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

    GMT+8, 2024-5-4 11:29 , Processed in 0.072907 second(s), 70 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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