0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

STM32—串口输出字符串的几种方法

冬至子 来源:一禾嵌入式开发 作者:季鹏 2023-07-22 10:44 次阅读

C语言中有个很好用的函数:printf()。printf()是格式化输出函数,可以按照规定格式输出消息。相信每个工程师开始学习的C语言第一课都会遇到printf(“Hello World! n”);这条语句。

嵌入式开发中,我们调试时时常需要输出一些调试信息,那这时候printf语句就非常有用了。但是遗憾的是,C标准库函数中默认的输出设备是显示器,所以当我们进行嵌入式开发的时候,是不能够直接使用printf的。如果我们想要方便的在嵌入式开发中进行printf操作,那么就必须重定向printf语句。

我们可以查一下C标准库函数,printf语句其实是使用了一个函数int fputc(int ch, FILE *f); 此函数原本是将字符ch打印到文件指针所指向的文件流中去的,现在我们不需要打印到文件流,而是打印到串口1。我们只需要重新编写这个函数。当系统检测到用户编写的fputc函数时,就会调用用户所编写的函数,而不是使用原本的fputc了。

函数如下:

图片

注意这里需要使用到头文件stdio.h,否则FILE类型未定义。以上是基于MDK环境下,使用MicroLib的情况下重定向printf。还有一种方法是使用半主机模式。半主机模式是ARM的一种机制,不使用microLib库,实现ARM应用程序代码的输入/输出请求传至运行着调试器的主机,这样就可以使用主机的显示器和键盘,而不需要再ARM系统上搭配显示器和键盘。当然,这种做法并不常见,有兴趣的同学可以自己研究一下。

如果这篇文章到这里就结束了,那么就太常规了。下面我还要讲一个非常规的操作以实现串口输出字符串。

Printf重定向的方法是非常常规的,但是我就是不想用,而且我还想调用一个函数就能输出一串任意的字符串,怎么办?我就想出了另一种写法,先贴代码:

图片

乍一看,这段代码非常简单啊,就是使用了一个指针,然后串口输出的时候指针指向的地址不停+1啊!但是我们再看一下调用:

图片

我们这里直接将一个字符串作为参数进行了传递,编译器报了一个警告:warning: ‘char[25]’ to parameter of type ‘uint8_t *’ (aka ‘unsigned char *’) converts between pointers to integer types with different sign。

很明显,数据类型冲突了。但是在程序中我们将两种方式都进行了输出,最后发现调试结果是正确的。如下图所示。

图片

图片

这是为什么呢?其实也很简单,我们这里进行了一个非法操作。当我们调用该函数时,将字符串数组作为实参,在函数定义中强制转换成了一个指针。而这个指针,指向的是字符串数组的第一个地址,所以该函数运行时就能够正确输出我们所编写的字符串了。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 显示器
    +关注

    关注

    21

    文章

    4978

    浏览量

    139971
  • STM32
    +关注

    关注

    2270

    文章

    10900

    浏览量

    355924
  • ARM处理器
    +关注

    关注

    6

    文章

    360

    浏览量

    41738
  • C语言
    +关注

    关注

    180

    文章

    7604

    浏览量

    136791
  • 调试器
    +关注

    关注

    1

    文章

    305

    浏览量

    23739
收藏 人收藏

    评论

    相关推荐

    输出字符串数组问题

    3. 要求输出字符串数组“ APPLy:sin 频率,幅度” 其中幅度为数值类型,由输入控件设定。频率范围和步长由输入控件设定。例如幅度为2,频率范围为1000-8000Hz,步长1000Hz,输出字符串
    发表于 10-20 11:05

    Python字符串的特点和修改字符串的常见四种方法

    Python中修改字符串几种方法
    发表于 02-26 16:52

    为什么stm32程序使用printf函数无法通过串口输出字符串

    为什么stm32程序使用printf函数无法通过串口输出字符串呢?怎样去解决这个问题呢?
    发表于 11-25 06:35

    解决读取TXT文件时输出字符串乱码问题

    解决读取TXT文件时输出字符串乱码问题打开TXT文件时如果内容中存在中文,输出时会出现乱码问题,因为labview默认的编码格式是UTF-8
    发表于 12-23 14:23

    python字符串拼接方式了解

    ()方法拼接 用string模块中的Template对象 例子: fruit1 = ‘apples’ fruit2 = ‘bananas’ fruit3 = ‘pears’ 要求: 输出字符串
    发表于 12-06 10:09 1034次阅读

    如何利用STM32单片机串口发送字符串

    最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。
    发表于 12-10 16:01 1.6w次阅读

    基于STM32单片机发送字符串的函数

    最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。
    发表于 01-04 15:05 4918次阅读

    C语言中字符串拷贝函数有几种方法

    strcpy,即string copy(字符串复制)的缩写。 是C语言标准库中实现字符串拷贝的一个函数。 各大公司笔试题最喜欢考的一道题,快来看看,你会几种方法? 问:你会如何实现这个函数呢? 1
    的头像 发表于 03-12 14:16 4773次阅读

    利用STM32单片机串口发送字符串

    最近由于要调试一个SMS发送短信的模块,该模块需要发送一系列AT指令,且需要字符串发送,但是STM32官方给的usart.c中并没有直接发送字符串的函数,因此写了一个发送字符串的函数。
    发表于 11-19 10:36 13次下载
    利用<b class='flag-5'>STM32</b>单片机<b class='flag-5'>串口</b>发送<b class='flag-5'>字符串</b>

    STM32串口的介绍与使用(原理、结构体、发送字符串、printf函数重定向)

    串口相关知识1.定义2.通信概念3.USART简介串口的结构体串口发送字符STM32发送到上位机)串口
    发表于 12-24 19:08 20次下载
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>的介绍与使用(原理、结构体、发送<b class='flag-5'>字符串</b>、printf函数重定向)

    python字符串有哪些特定方法

    python字符串序列操作也适用于列表和元组。 python字符串还有独有方法,即字符串对象的函数,其他对象不可调用,只有字符串对象可
    的头像 发表于 02-23 15:02 710次阅读

    C语言定义字符串几种方法

    C语言中定义字符串有哪些方法
    的头像 发表于 03-31 09:41 3565次阅读

    STM32串口格式化输出几种方法介绍

    在前两天介绍的串口输出中,函数Usart1_SendStr只能输出字符串,如果想输出一个整型或者其他类型的数据,单独用这个函数是不能实现的。
    的头像 发表于 07-22 10:16 3096次阅读
    <b class='flag-5'>STM32</b><b class='flag-5'>串口</b>格式化<b class='flag-5'>输出</b>的<b class='flag-5'>几种方法</b>介绍

    串口屏LUA教程6-运算和字符串处理

    串口屏LUA教程6-运算和字符串处理
    发表于 04-29 13:11 11次下载

    python输出固定长度的字符串

    Python 是一种强大而灵活的编程语言,具有许多用于处理字符串的功能。在 Python 中,有多种方法可以输出固定长度的字符串。下面将详细介绍这些
    的头像 发表于 11-22 10:41 3320次阅读