上回说了如何简单的使用串口,即接收pc机发送过来的数据,然后通过串口原样发送回去。这种方式在日常应用当中玩玩还可以,但真正在正规的项目当中,尤其是数据格式不定的情况下,用这种方式局限性太大,输出格式太死,不便于灵活控制发送格式。这回我们来讲讲如何使用C语言的printf来重定向到串口当中。这篇也是试用的最后一篇,顺便结题,好吧。。。看帖 在一个运行操作系统的系统中,比如我们pc机吧,有一个概念叫做文件描述符,对于linux来讲,它的特性是一切设备皆文件,也就是说,一切设备,可以像读写文件一样来操作。文件描述符就是一个区分文件的东西,实际系统当中,是没有文件名的概念的,文件名只是在文件系统中给用户看的,操作系统只认识文件描述符这东西。为啥要说文件描述符呢?这是因为基本上所有系统中,都有三个默认的文件描述符已经打开了,分别是标准输入stdin、标准输出stdout和标准错误stderror。这三个描述符的作用是为了系统启动后,与用户进行最基本的交互。比如说,我们pc机开机后,所有的信息是通过屏幕看到的,所以,pc机开机默认的标准输出是屏幕,我们向系统中输入命令等信息,是通过键盘输入的,所以pc开机之后的默认标准输入是键盘。那标准错误是啥?系统出了故障,是不是也是通过屏幕告诉我们的?所以,这样的系统中,标准输出、标准错误均是定向到了屏幕上。那么问题来了,对于一些没有屏幕的系统,比如我们要开发一款嵌入式设备,跑的是linux系统,但不需要屏幕,这时候系统出了故障,怎么告诉我们呢?这里面就需要重定向进行操作了。重定向笼统的说,就是把原来系统默认的标准输入、标准输出、标准错误这三个文件描述符,和默认的键盘、屏幕取消绑定,与我们指定的另外设备绑定。例如上面这个系统,我们可以将标准输出和标准错误重定向到串口,然后接上串口,就可以看到系统的输出和错误信息了。 问题又来了,我们的 STM32开发板并没有运行系统,为何也有重定向这个概念呢?这应该得益于C语言的标准库了,这里指的不是st的固件库,而是C语言的标准库,你像为什么我们在linux、windows等所有操作系统下,都可以使用printf、strlen等函数呢?这都是c语言标准库提供的。这里我们的板子没有跑系统,但IAR开发环境给我们提供了标准C库的一些头文件,我们开发的时候,将这些文件包含进去,就可以使用标准C函数了。 将上节的文件夹拷贝重命名为:
打开该工程,在uart2.c文件中加入串口的重定向函数:
很简单的几行代码,重定向了printf函数需要调用的fputc函数,这个最基本的函数修改成这样后,我们就可以通过printf来通过串口发送数据了,然后我们在printf里面的格式控制符,都是由printf函数进行转换的。注意在这个uart2.c里面包含头文件:
然后,修改main.c如下:
这里面,我们可以通过printf来控制输出的格式了。这里面还有个地方需要注意! 仅仅做如上修改还不能实现我们要的效果,甚至编译都通过不了,因为我们的IAR默认是没有包含这个printf包的,所以我们要在设置中包含这些标准C库的函数包:
然后,重新编译,就可以发现,我们的输出和用pc编程时的printf输出一样了,里面的所有格式控制都可以根据标准C的来:
至此,我们的STM32F030R8开发板试用贴到此就更新完毕了。感谢大家的关注与支持!最后,再对该板子进行一下试用总结吧: 这板子总体来说功能不错,作为一款核心板,是可以完爆市面上其它产品的。引脚扩展方便、所有引脚引出,方便使用,而且,最关键的是板载串口电压转换芯片。这对板子的调试以及输出信息可以说是方便了不少。然后,板子的大小也很合适,放在桌面上也不占地方。下面说说个人感觉不足的地方: 第一:板子背面靠排针支撑,这可能是为了和主板连接方便设计的吧,但我个人感觉,是不会有人买入大量开发板,只做一块底板,形成一个产品,往外销售的。排针支撑不但容易划伤桌面,固定也不够牢靠,轻轻一推,就滑走了。。。 第二,主板stlink接口不明确,stlink接口板子上看不出来引脚分布,而且主板的stlink接口为排座,不方便用其它编程器进行调试。个人建议将主板stlink接口换成排针,并给出丝印标示,与stlink通过排线连接。 第三,stlink调试时指示灯太大太亮,开始调试很是刺眼。如果stlink与主板之间通过排线连接,这个问题可以得到缓解。 第四,stlink裸板没有保护措施,如果手上比较湿,搞不好会烧掉stlink严重的小心干掉主板。。。建议给stlink弄一个保护套,简单点就行,用一个透明的热缩管包住即可。别忘了给stlink的接口也打上丝印标示啊。。。 不知如此结题可否?感谢小编给的机会,感谢小编,感谢发烧友,多谢大家。。。
|