c++获取串口设备名称_「正点原子Linux连载」第二十二章串口格式化函数移植实验...

1)实验平台:正点原子Linux开发板

2)摘自《正点原子I.MX6U嵌入式Linux驱动开发指南
关注官方微信号公众号,获取更多资料:正点原子

ac0e4e772a7a0bdc074e9259e049dbd4.png

第二十二章串口格式化函数移植实验

上一章实验我们实现了UART1基本的数据收发功能,虽然可以用来调试程序,但是功能太单一了,只能输出字符。如果需要输出数字的时候就需要我们自己先将数字转换为字符,非常的不方便。学习STM32串口的时候我们都会将printf函数映射到串口上,这样就可以使用printf函数来完成格式化输出了,使用非常方便。本章我们就来学习如何将printf这样的格式化函数移植到I.MX6U-ALPHA开发板上。

22.1串口格式化函数简介

格式化函数说的是printf、sprintf和scanf这样的函数,分为格式化输入和格式化输出两类函数。学习C语言的时候常常通过printf函数在屏幕上显示字符串,通过scanf函数从键盘获取输入。这样就有了输入和输出了,实现了最基本的人机交互。学习STM32的时候会将printf映射到串口上,这样即使没有屏幕,也可以通过串口来和开发板进行交互。在I.MX6U-ALPHA开发板上也可以使用此方法,将printf和scanf映射到串口上,这样就可以使用SecureCRT作为开发板的终端,完成与开发板的交互。也可以使用printf和sprintf来实现各种各样的格式化字符串,方便我们后续的开发。串口驱动我们上一章已经编写完成了,而且实现了最基本的字节收发,本章我们就通过移植网上别人已经做好的文件来实现格式化函数。

22.2硬件原理分析

本章所需的硬件和上一章相同。

22.3实验程序编写

本实验对应的例程路径为:开发板光盘-> 1、裸机例程->14_printf。

本章实验所需要移植的源码已经放到了开发板光盘中,路径为:1、例程源码->5、模块驱动源码->2、格式化函数源码->stdio,文件夹stdio里面的文件就是我们要移植的源码文件。本章实验在上一章例程的基础上完成,将stdio文件夹复制到实验工程根目录中,如图22.3.1所示:

532dbe64be73cf480e75723f3a09fc81.png

图22.3.1添加实验源码

stdio里面有两个文件夹:include和lib,这两个文件夹里面的内容如图22.3.2所示:

f854cf0ddc7f983da639f692454c925b.png

图22.3.2stdio所有源码文件

图22.3.2就是stdio里面的所有文件,stdio里面的文件其实是从uboot里面移植过来的。后面学习uboot以后大家有兴趣的话可以自行从uboot源码里面“扣”出相应的文件,完成格式化函数的移植。这里要注意一点,stdio中并没有实现完全版的格式化函数,比如printf函数并不支持浮点数,但是基本够我们使用了。

移植好以后就要测试相应的函数工作是否正常,我们使用scanf函数等待键盘输入两个整数,然后将两个整数进行相加并使用printf函数输出结果。在main.c里面输入如下内容:

示例代码22.3.1 main.c文件代码

/**************************************************************

Copyright © zuozhongkai Co., Ltd. 1998-2019. All rights reserved.

文件名 : main.c

作者 : 左忠凯

版本 : V1.0

描述 : I.MX6U开发板裸机实验14 串口print实验

其他 : 本实验在串口上移植printf,实现printf函数功能,方便以后的

程序调试。

论坛 : www.openedv.com

日志 : 初版V1.0 2019/1/15 左忠凯创建

**************************************************************/

1 #include "bsp_clk.h"

2 #include "bsp_delay.h"

3 #include "bsp_led.h"

4 #include "bsp_beep.h"

5 #include "bsp_key.h"

6 #include "bsp_int.h"

7 #include "bsp_uart.h"

8 #include "stdio.h"

9

10/*

11 * @description : main函数

12 * @param : 无

13 * @return : 无

14 */

15int main(void)

16{

17 unsignedchar state = OFF;

18 int a , b;

19

20 int_init(); /* 初始化中断(一定要最先调用!) */

21 imx6u_clkinit(); /* 初始化系统时钟 */

22 delay_init(); /* 初始化延时 */

23 clk_enable(); /* 使能所有的时钟 */

24 led_init(); /* 初始化led */

25 beep_init(); /* 初始化beep */

26 uart_init(); /* 初始化串口,波特率115200 */

27

28 while(1)

29 {

30 printf("输入两个整数,使用空格隔开:");

31 scanf("%d %d",&a,&b);/* 输入两个整数 */

32 printf("数据%d + %d = %d", a, b, a+b);/* 输出和 */

33

34 state =!state;

35 led_switch(LED0,state);

36 }

37

38 return0;

39}

第30行使用printf函数输出一段提示信息,第31行使用函数scanf等待键盘输入两个整数。第32行使用printf函数输出两个整数的和。程序很简单,但是可以验证printf和scanf这两个函数是否正常工作。

22.4编译下载验证

22.4.1编写Makefile和链接脚本

修改Makefile中的TARGET为printf,在INCDIRS中加入“stdio/include”,在SRCDIRS中加入“stdio/lib”,修改后的Makefile如下:

示例代码22.4.1.1 Makefile文件代码

1 CROSS_COMPILE ?= arm-linux-gnueabihf-

2 TARGET ?=printf

3

4/* 省略掉其它代码...... */

5

6 INCDIRS := imx6ul

7 stdio/include

8 bsp/clk

9 bsp/led

10 bsp/delay

11 bsp/beep

12 bsp/gpio

13 bsp/key

14 bsp/exit

15 bsp/int

16 bsp/epittimer

17 bsp/keyfilter

18 bsp/uart

19

20 SRCDIRS := project

21 stdio/lib

22 bsp/clk

23 bsp/led

24 bsp/delay

25 bsp/beep

26 bsp/gpio

27 bsp/key

28 bsp/exit

29 bsp/int

30 bsp/epittimer

31 bsp/keyfilter

32 bsp/uart

33

34/* 省略掉其它代码...... */

35

36$(COBJS): obj/%.o : %.c

37$(CC) -Wall -Wa,-mimplicit-it=thumb -nostdlib -fno-builtin -c -O2 $(INCLUDE) -o $@ $<

38

39 clean:

40 rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS)$(SOBJS)

第2行修改变量TARGET为“printf”,也就是目标名称为“printf”。

第7行在变量INCDIRS中添加stdio相关头文件(.h)路径。

第28行在变量SRCDIRS中添加stdio相关文件(.c)路径。

第37行在编译C文件的时候添加了选项“-Wa,-mimplicit-it=thumb”,否则的话会有如下类似的错误提示:

thumb conditional instruction should be in IT block -- `addcs r5,r5,#65536'

链接脚本保持不变。

22.4.2编译下载

使用Make命令编译代码,编译成功以后使用软件imxdownload将编译完成的printf.bin文件下载到SD卡中,命令如下:

chmod 777 imxdownload //给予imxdownload可执行权限,一次即可

./imxdownload printf.bin /dev/sdd //烧写到SD卡中

烧写成功以后将SD卡插到开发板的SD卡槽中,打开SourceCRT,设置好连接,然后复位开发板。SourceCRT显示如图22.4.2.1所示:

2850eb71c01ba6bf9a2c75ade0eb0a55.png

图22.4.2.1 SourceCRT默认显示界面

根据图22.4.2.1所示的提示,输入两个整数,使用空格隔开,输入完成以后按下“回车键”,结果如图22.4.2.2所示:

4e9c294eec127308eb377babc943e458.png

图22.4.2.2计算输入结果显示

从图22.4.2.2可以看出,输入了32和5,这两个整数,然后计算出32+5=37。计算和显示都正确,说明格式化函数移植成功,以后我们就可以使用printf来调试程序了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值