请教坛友,KEIL中PRINTF发送时间长如何修改?
一直用这个命令没问题,后来 用串口屏,有大量的数据,才发现这个命令发送数据时间长,请问有没有办法改一下? 这本身就耗时长,没有办法的事情,除非你自己重写这函数。这原装的函数考虑的场景太多所以过于臃肿,虽然我们使用的很少部分。 怎么发现时间长的?多半不是printf的问题吧,把串口波特率调高些?
再不行就先用sprintf输出到字符串,然后dma发送,不过程序得优化优化了。 makesoft 发表于 2019-6-14 15:47
这本身就耗时长,没有办法的事情,除非你自己重写这函数。
这原装的函数考虑的场景太多所以过于臃肿,虽然 ...
谢谢!时间太长,占用资源。 tomzbj 发表于 2019-6-14 15:57
怎么发现时间长的?多半不是printf的问题吧,把串口波特率调高些?
再不行就先用sprintf输出到字符串,然后 ...
我的是51单片机,没有DMA。 ZHAOBAO511 发表于 2019-6-14 16:09
我的是51单片机,没有DMA。
那得用发送完成中断,加上状态判断,在中断里启动发送下一个字符,稍微有点折腾,不过比卡着等发送完成的效率高多了。 PRINTF 是固定的函数,KEIL自带的。 DMA赶紧用上吧 我将115200换成921600,速度提高了不少。 楼主赶紧换回stm32吧。
为了一个破51,问东问西,降低身价,不值。{:curse:} leiyitan 发表于 2019-6-14 22:04
DMA赶紧用上吧
谢谢!没用STM32。 zxq6 发表于 2019-6-14 22:33
我将115200换成921600,速度提高了不少。
几个串口设备,要换都要换。 su33691 发表于 2019-6-15 01:28
楼主赶紧换回stm32吧。
为了一个破51,问东问西,降低身价,不值。
不是便宜的51,是100元的51. 提高编程水平和对芯片的深入理解。
就是用51,也可以不用printf直接输出而是用sprintf转字符串再在串口中断内发送,串口中断发送采用环形缓冲区,待发送的数据打入缓冲区。 makesoft 发表于 2019-6-14 15:47
这本身就耗时长,没有办法的事情,除非你自己重写这函数。
这原装的函数考虑的场景太多所以过于臃肿,虽然 ...
最大可能是同步发送造成的把串口发送搞成异步才行 最简单sprintf再发送 putc ()的问题吧,用中断发送,没发完不允许执行下一个printf。 大家建议楼主先sprintf,估计一会楼主又会发现说,我内存不够啊,之前printf出去一次差不多2k个字符,我的51内存才256+1024个字节, 我就尽量不在mcu中用printf,太慢了,又慢又大的函数
输出通常是有限的,自行实现即可 用51还敢用printf,谁给你的勇气?梁静茹吗?^_^ 1a2b3c 发表于 2019-6-15 12:14
大家建议楼主先sprintf,估计一会楼主又会发现说,我内存不够啊,之前printf出去一次差不多2k个字符,我的5 ...
100块的呢 1a2b3c 发表于 2019-6-15 12:14
大家建议楼主先sprintf,估计一会楼主又会发现说,我内存不够啊,之前printf出去一次差不多2k个字符,我的5 ...
起码比c8051和68013那种牛逼速度和容量都不差的只是通用外设简陋靠主频和内存扛可以 cocom 发表于 2019-6-15 11:05
提高编程水平和对芯片的深入理解。
就是用51,也可以不用printf直接输出而是用sprintf转字符串再在串口中断 ...
谢谢!后边试试! Doding 发表于 2019-6-15 11:49
putc ()的问题吧,用中断发送,没发完不允许执行下一个printf。
上次看过一篇文章,有个人改过,后来找不到那篇文章了。 1a2b3c 发表于 2019-6-15 12:14
大家建议楼主先sprintf,估计一会楼主又会发现说,我内存不够啊,之前printf出去一次差不多2k个字符,我的5 ...
真心不懂你说的。 Earthman 发表于 2019-6-15 12:31
我就尽量不在mcu中用printf,太慢了,又慢又大的函数
输出通常是有限的,自行实现即可 ...
没办法的时候用一下。 hexenzhou 发表于 2019-6-15 12:51
用51还敢用printf,谁给你的勇气?梁静茹吗?^_^
这是为什么?51有那么差? huangqi412 发表于 2019-6-15 13:21
100块的呢
对哦,100的CPU。 我觉得楼主描述上更是有问题,或者是误导了大家,
第一就是你说的慢,到底是说因为要传输的内容太多了,所以慢,还是说因为printf函数计算判断本身消耗的mcu周期太长导致太慢,我敢肯定你自己都没有去搞清楚,因为要搞清楚很简单,示波器看一下串口输出的字节间是不是有很长的间隔?而那个就是处理时间,如果是的话,那么可以换个方式,比如前面一些人说的用自己的函数代替库函数,这样精简,以缩短处理时间;
如果不是上面说的那样,那么根本是无解的命题,这个你自己算一下就知道传输你的内容需要多长时间,如果消耗的时间和大致计算出来通信本身消耗的时间比较一致,那唯一解决的办法就是提高通信带宽,也就是提高波特率,这是唯一的解决之道。
举个例子,你用115200的波特率传输1k字节内容,为了方便估算,我们按一个字节100us来简单估算,那么1k字节内容就是100ms左右,10k个字符就需要1秒钟才能传完,如果你波特率更低,那么传输时间就成倍的加大了,我认为这个时间比起你的printf里面的一些计算、判断来说,后者完全可以忽略吧? 即使你换个自己写的函数或者DMA什么的,用于都摆脱不了串口本身的传输时间,因为即使不使用DMA,也可以改成上一个字节正在传输的这个100us内计算处理下一个字节的内容,这样整体下来实际上可以等效为处理本身完全不消耗时间了,时间都在串口移位本身上面, 1a2b3c 发表于 2019-6-15 16:09
我觉得楼主描述上更是有问题,或者是误导了大家,
第一就是你说的慢,到底是说因为要传输的内容太多了,所 ...
首先你要搞清楚,波特率一定的情况下,发送字节时间固定,怎么可能有长有短?唯一的可能性就是发完的中间延时。 你都说了中间延时,那么你自己测过么?延时多少,这个时间是不是与串口占用的时间相比到了可以相当的程度或者必须要计较的程度?如果是,前面也说了解决或者降低这个影响的方法,
楼主有个虚心的态度好不?楼上给你分析的够清楚明白了吧。看你签名,就这水平还教别人呢? didadida 发表于 2019-6-17 10:24
楼主有个虚心的态度好不?楼上给你分析的够清楚明白了吧。看你签名,就这水平还教别人呢? ...
哎,我倒是没有想这些,本着讨论与交流的态度,大家共同进步而已,
你这么一说我到是真的觉得就此打住吧,不再跟这个贴了 didadida 发表于 2019-6-17 10:24
楼主有个虚心的态度好不?楼上给你分析的够清楚明白了吧。看你签名,就这水平还教别人呢? ...
{:smile:} 楼上分析的是清楚的,看了他几个留言就知道了。
页:
[1]