打印
[疑难问答]

在keil中使用printf()函数的要点

[复制链接]
1268|29
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
usysm|  楼主 | 2023-5-15 10:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
在keil中printf默认是向串口中发送数据的,所以,如果应用该函数,必须先初始化串口,否则可能引起死机的情况,并且在printf之前应该先将TI置位,摘抄原因如下:

1.printf函数是调用putchar函数输入的,而putchar应该是先判断ti是否为1,不为1则等待为1。如果为1则清0,然后送出一 个字符。因此你如果直接使用printf函数,你的程序就会在putchar函数中等待ti为1。这时你的程序就相当于直接死掉了。你可以通过改写 putchar函数实现自己的目的的。

2.Keil的串口处理比较巧妙的,我的分析如下:
   putchar.c里面,是先检测TI再发送。这样做的目的是把尽可能多的时间留给2次串口操作之间的程序,而不是把等待字节发送的时间白白空等待浪费掉。所以,在系统初始化的时候,一定要令TI=1; 就可以顺畅的使用printf函数了。搂主sbuf=" "的办法,其实就是令TI=1.   另外要特别注意,printf函数执行完毕后,最后一个字节并未发送完毕,例如在485通讯中,此时如果切换为收模式,会丢失最后一字节.

3.一般串口发送都是等TI(字节发送完标志)为1就马上发送下一字节,由于不管是中断还是查询TI标志的方法,都会检测TI,因此首次发送必须置 位TI标志,使串口开始发送你的“在程序的初始化部分往串口数据寄存器SBUF里放一个字符来起用终端显示;”方法最终作用也就是把TI置1,改成 TI=1;来启动发送也是一样的(当然,不会发出那个' '字符了)。

4.<stdio.h>中定义,调用底层的putchar()来实现.底层发送数据到串口时,先查TI=1是否成立,死等直到TI=1时将新数据写入SBUF,函数返回,所以要先将TI置1,启动第一次传输操作.可查看反汇编相关代码理解其工作机理!

使用特权

评论回复
沙发
vivilyly| | 2023-7-22 17:18 | 只看该作者
引入了<stdio.h>头文件,该头文件包含了printf()函数的声明和相关定义。

使用特权

评论回复
板凳
uptown| | 2023-7-22 19:10 | 只看该作者
在使用printf()函数输出大量数据时,需要注意输出缓冲区的大小。确保缓冲区足够大,能够容纳要输出的数据,以避免溢出或截断输出。

使用特权

评论回复
地板
loutin| | 2023-7-22 19:23 | 只看该作者
需要注意printf()函数输出的数据类型和格式控制符的匹配,以防止数据错误或未定义行为。

使用特权

评论回复
5
jkl21| | 2023-7-22 19:30 | 只看该作者
通过正确配置和初始化串口,重定向标准输出,以及合理使用printf()函数,可以在Keil中方便地进行输出和调试。

使用特权

评论回复
6
cemaj| | 2023-7-22 19:37 | 只看该作者
printf()函数的输出会被缓存在内存中,直到程序退出或者手动调用fflush()函数清空输出缓冲区。

使用特权

评论回复
7
elsaflower| | 2023-7-22 20:02 | 只看该作者
在Keil中使用printf()函数需要包含头文件stdio.h。

使用特权

评论回复
8
linfelix| | 2023-7-22 20:46 | 只看该作者
可以配置编译器的优化选项,例如禁用特定的优化,或者使用volatile关键字来防止对关键变量的优化。

使用特权

评论回复
9
robincotton| | 2023-7-22 20:55 | 只看该作者
Keil使用C标准库提供printf()函数的实现。在项目设置中,需要启用C标准库,并选择合适的库版本,以确保printf()函数可用。

使用特权

评论回复
10
benjaminka| | 2023-7-22 21:25 | 只看该作者
printf()函数输出的字符可能会影响系统的实时性

使用特权

评论回复
11
cemaj| | 2023-7-22 21:43 | 只看该作者
printf()函数的输出位置是在程序的主循环中,即在其他函数调用之前执行。

使用特权

评论回复
12
albertaabbot| | 2023-7-22 22:05 | 只看该作者
在Keil中使用printf()函数需要注意其使用方法和输出控制,以便实现准确、可靠和安全的输出。

使用特权

评论回复
13
51xlf| | 2023-7-23 16:45 | 只看该作者
需要配置正确的串口参数,以便与 目标硬件进行通信。这包括波特率、数据位、停止位和校验位等参数。

使用特权

评论回复
14
jackcat| | 2023-7-23 17:02 | 只看该作者
在Keil的工程设置中,你需要选择正确的输出设备。这可以是串口、仿真器或其他可用的设备

使用特权

评论回复
15
uytyu| | 2023-7-23 17:14 | 只看该作者
在不需要使用printf()函数输出时,可以关闭重定向,以恢复标准输出到默认状态。

使用特权

评论回复
16
pixhw| | 2023-7-23 17:50 | 只看该作者
在实际使用中,可以通过设置标志位或条件语句来控制是否输出调试信息。这样可以在需要时启用printf()函数输出信息,在不需要时禁用,以提高系统性能和输出效率。

使用特权

评论回复
17
mnynt121| | 2023-7-23 18:51 | 只看该作者
为了使printf()函数输出到正确的串口,需要实现一个重定向函数,将printf()的输出重定向到目标设备的串口。

使用特权

评论回复
18
bartonalfred| | 2023-7-23 19:35 | 只看该作者
Keil提供了一个重定向标准输出的功能,使得printf()函数的输出可以通过你选择的输出设备进行显示。

使用特权

评论回复
19
dspmana| | 2023-7-23 20:04 | 只看该作者
当启用printf()函数进行调试输出时,一些编译器默认情况下可能会对代码进行优化,导致printf()函数的输出结果不符合预期。

使用特权

评论回复
20
primojones| | 2023-7-23 20:46 | 只看该作者
printf()函数会增加代码大小和运行时开销,因此在生产代码中应尽量避免使用。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

57

主题

4023

帖子

3

粉丝