例4.8是单个字符接收、传送,如果是字符串接收、传送时,则需要编写较复杂的程序来实现。我们在学习C语言时,经常用到printf()函数或者scanf()函数,这两个函数具有强大的格式化转换功能,很容易实现各种类型的输出、输入。但是printf()函数是格式化输出到屏幕的,scanf()函数又是格式化输入(从屏幕),并不能输出到串口,如果想使串口进行发送、接收,就必须进行重定向。
printf()函数、scanf()函数的头文件是stdio.h,只要重写以下两个函数即可完成输出、输入的重定向。
在重定向fputc、fgetc后,并要在keil环境中勾选Options-Target中的Use Micro LIB,如图4.21所示。
图4.21 重定向选项设置
【例4.9】在例4.4基础上,使用spintf、scanf重定向,实现使用按键控制LED1的亮灭,PC机端通过串口发送命令查看LED1的亮灭状态。若STM32单片机接收到的是约定的命令(如status-led),则发送LED1的亮灭状态;否则,发送错误命令提醒信息。
编程分析:本例是外部中断、串口通信及spintf、scanf重定向等的结合,程序可在例4.4、例4.8基础上修改、添加即可。
编程要点如下。
(1)初始化按键引脚PC5和LED引脚PB5。
(2)开启所用外设时钟。
(3)配置NVIC(中断优先级)。
(4)初始化外部中断。
(5)编写EXTI(外部中断)服务函数。
(6)初始化串口引脚。
(7)开启串口所用外设时钟。(https://www.daowen.com)
(8)配置串口。
(9)编写主函数。
程序编写及分析:由于本例4.4、例4.8的基础上实现,因此需要把相关文件拷贝过来。
(1)复制例4.4工程文件夹,并将例4.8工程文件夹下的USART_init文件夹复制到刚复制过来的例4.4工程文件夹下。
(2)打开工程,添加stm32f10x_usart.c、串口初始化USART_init.c源程序文件到工程中,并将对应的头文件路径添加到编译路径中。
(3)打开工程把不需要的程序删除。由于spintf、scanf不使用中断,把串口初始化USART_init.c源程序文件中的使能中断语句,中断优先级初始化删除。
(4)重新编写主程序。
由于其他程序在例4.4、例4.8已经讲述,这里只介绍主程序,如下所述。
实验结果如图4.23所示。
图4.23 例4.9运行结果截图
注意:在使用串口调试助手时,输完最后一个字符后再键入一个空格,然后发送,否则会出现类似死机的现象。
由于使用scanf()需要等待数据输入,对于串口接收字符串,一般使用接收中断,在中断服务程序中编程来实现字符串的接收,以提高程序执行效率。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。