LAOXU 发表于 2023-12-2 08:19:52

tzz1983 发表于 2023-12-1 22:23
你即然研究过了, 那肯定知道可变参数的传递规则了, 不知道的话再百度一下, 就可以知道了. 传递参数搞定
至 ...

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

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

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

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

以尽量减轻堆栈压力.

QQ624353765 发表于 2023-12-2 08:40:19

LAOXU 发表于 2023-11-30 14:49
两位大师, 帮忙看看, 如何解决不同类型的数据, 统一转换成 long类型.

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

用共用体



LAOXU 发表于 2023-12-2 10:11:27

QQ624353765 发表于 2023-12-2 08:40
用共用体

谢谢回复,

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

开物 发表于 2024-1-20 10:45:39

我来学习的~讨论的很精彩~

wangxiangtan 发表于 2024-1-20 20:59:50

QQ624353765 发表于 2023-11-28 19:39
这些情况我都考虑全了,没有问题
首先发送的数据包是在pdata中,pdata只用来存零时数据包,数据包长度不超 ...

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

13918210822 发表于 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接收
}

tzz1983 发表于 2024-1-31 09:49:58

13918210822 发表于 2024-1-30 22:15
请问是否需要打开DMA超时才能通过DMA正确接收不定长的串口数据?
如果目前这样的方式, 是否要加一个环缓冲才 ...

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

小233宋 发表于 2024-2-22 09:38:54

{:4_196:}终于找到用法简单的了,谢谢博主!!!

jwg 发表于 2024-2-22 11:23:12

下载学习下,谢谢楼主分享!

小飞侠 发表于 2024-3-21 07:48:00

官方代码代码只保证实现功能,在实际应用中,还需要自己做一些稳定性措施
页: 1 2 [3] 4 5 6
查看完整版本: 4组串口UART使用DMA收发 @32G系列,易用,高效,稳定 !精品实战代码