一个项目用到32下的多个串口,一般STM32C8T6型号拥有3个USART,串口的配置都很简单,但是要使用的话就得解决他们之间的矛盾,

printf函数到底输出在哪一个串口中?

先看这函数:

//重定义fputc函数,方便使用printf
int fputc(int Data, FILE *f)
{
while(!USART_GetFlagStatus(USART1,USART_FLAG_TXE)); //USART_GetFlagStatus:得到发送状态位
//USART_FLAG_TXE:发送寄存器为空 1:为空;0:忙状态
USART_SendData(USART1,Data); //发送一个字符 return Data; //返回一个值
}

在我们使用printf函数的时候,首先必须重定义fputc函数,在这个函数中,实现数据的发送,然后在     USART_SendData(USART1,Data);  中选择需要的串口。一般是选择串口1,所以这种情况下,

使用printf函数会打印到串口1。

那么我要用到串口2的printf函数该怎么办呢 ?

配置什么的还是和串口1一样,
1.配置usart2的串口配置,gpio,rcc enable。。。。
2.勾选usb micro lib,
3.添加头文件#include <stdarg.h>,编写USART2的printf函数:

void USART2_printf (char *fmt, ...)
{
char buffer[CMD_BUFFER_LEN+]; // CMD_BUFFER_LEN长度自己定义吧
u8 i = ; va_list arg_ptr;
va_start(arg_ptr, fmt);
vsnprintf(buffer, CMD_BUFFER_LEN+, fmt, arg_ptr);
while ((i < CMD_BUFFER_LEN) && buffer)
{
USART_SendData(USART2, (u8) buffer[i++]);
while (USART_GetFlagStatus(USART2, USART_FLAG_TC) == RESET);
}
va_end(arg_ptr);
}

仔细看我们会发现,其实这个函数中包含了fputc,然后吧   USART_SendData(USART1,Data);   改为  USART_SendData(USART2,(u8)buffer[i++]);   循环通过串口2发送。

还有一种方法就是自己实现 printf的源码(参考秉火程序):

/*
* 函数名:USART2_printf
* 描述 :格式化输出,类似于C库中的printf,但这里没有用到C库
* 输入 :-USARTx 串口通道,这里只用到了串口2,即USART2
* -Data 要发送到串口的内容的指针
* -... 其他参数
* 输出 :无
* 返回 :无
* 调用 :外部调用
* 典型应用USART2_printf( USART2, "\r\n this is a demo \r\n" );
* USART2_printf( USART2, "\r\n %d \r\n", i );
* USART2_printf( USART2, "\r\n %s \r\n", j );
*/
void USART2_printf ( USART_TypeDef * USARTx, char * Data, ... )
{
const char *s;
int d;
char buf[]; va_list ap;
va_start(ap, Data); while ( * Data != ) // 判断是否到达字符串结束符
{
if ( * Data == 0x5c ) //'\'
{
switch ( *++Data )
{
case 'r': //回车符
USART_SendData(USARTx, 0x0d);
Data ++;
break; case 'n': //换行符
USART_SendData(USARTx, 0x0a);
Data ++;
break; default:
Data ++;
break;
}
} else if ( * Data == '%')
{ //
switch ( *++Data )
{
case 's': //字符串
s = va_arg(ap, const char *); for ( ; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );//程序死在了这
} Data++; break; case 'd':
//十进制
d = va_arg(ap, int); itoa(d, buf, ); for (s = buf; *s; s++)
{
USART_SendData(USARTx,*s);
while( USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET );
} Data++; break; default:
Data++; break; }
}
else USART_SendData(USARTx, *Data++);
while ( USART_GetFlagStatus ( USARTx, USART_FLAG_TXE ) == RESET ); }
}

然后在这里面修改串口号就可以。

参考资料:https://blog.csdn.net/xzongyuan/article/details/28626163

STM32下多串口用法的更多相关文章

  1. Mac下的串口通信-ORSSerialPort

    ================================2015/11/05======================================= 最近在工作中遇到有关Mac下串口通信 ...

  2. STM32 USB虚拟串口(转)

    源:STM32 USB虚拟串口 串口调试在项目中被使用越来越多,串口资源的紧缺也变的尤为突出.很多本本人群,更是深有体会,不准备一个USB转串口工具就没办法进行开发.本章节来简单概述STM32低端芯片 ...

  3. 【原创】STM32下波特率计算详解

    波特率的计算 STM32下的波特率和串口外设时钟息息相关,USART 1的时钟来源于APB2,USART 2-5的时钟来源于APB1.在STM32中,有个波特率寄存器USART_BRR,如下:     ...

  4. stm32中assert_param的用法说明

    stm32中assert_param的用法说明   首先是要知道条件判断语句 这个运算符分成三部分: (条件) ? (条件成立执行部分) :(条件不成立执行部分) 就这么简单 例如:a=(x>y ...

  5. 使用 VSCode 给STM32配置一个串口 printf 工程

    使用 VSCode 给STM32配置一个串口 printf 工程 gcc 重定向 printf 和 keil 不一样. 文件准备 先从以前的工程中拷过一份串口的代码来,然后在 main 函数中初始化串 ...

  6. Linux下的串口编程及非阻塞模式

    本篇介绍了如何在linux系统下向串口发送数据.包括read的阻塞和非阻塞.以及select方法. 打开串口 在Linux系统下,打开串口是通过使用标准的文件打开函数操作的. #include < ...

  7. xss其他标签下的js用法总结大全

    前段时间我遇到一个问题,就是说普通的平台获取cookie的语句为↓           Default <script src=js地址></script> 1 <scr ...

  8. [小技巧] shell 下查看串口是否工作正常

    在 Linux 下调试串口,是个麻烦的事情,尤其是嵌入式环境,很多时候要借助另一台设备来进行调试. 这里琢磨出一种可行的串口调试方法,可以简单的查看串口是否在正确工作. 1. 短接 tx 和 rx,让 ...

  9. linux下查看串口信息

    rs232串口通信接口:当通信距离较近时(<12m),可以使用电缆线直接连接,若距离较远,需附加调制解调器. 9个脚针的定义: CDC数据载波检测,RXD接收数据,TXD发送数据,DTR数据中断 ...

随机推荐

  1. mysql5.7 启动报发生系统错误2

    1. http://dev.mysql.com/downloads/mysql/        下载mysql5.7   zip包 2. 下载好后解压文件,解压的内容如图,您可以把内容解压到想要的位置 ...

  2. Gulp--Less

    摘要: 前面分享了一些less的是用方法,包括在grunt中,今天在分享下使用gulp来编译less文件.首先需要安装gulp,如何安装请看文章. 安装插件: gulp编译less使用了gulp-le ...

  3. python 类属性 、实例属性,可变数据结构作为类属性需要注意的地方

    1.一些经典的python错误不去阅读和不重视,就会把错误的做法带入到实际项目中来,甚至造成难以排查问题. 2.有一个大笨猪,按java写观察者模式,java写得是直接在类名下声明一个实例属性(不加s ...

  4. Oracle如何实现跨库查询

    实现结果:在一个数据库中某个用户下编写一个存储过程,在存储过程中使用DBLINK连接另一个数据库,从此数据库中的一个用户下取数,然后插入当前的数据库中的一个表中. 二. 实现方法步骤: 1. 创建存储 ...

  5. CentOS 6.3下搭建Web服务器

    准备前的工作: 1.修改selinux配置文件(/etc/sysconfig/selinux) 关闭防火墙 (1)把SELINUX=enforcing注释掉 (2)并添加SELINUX=disable ...

  6. android 读书笔记 1

    四层linux 内核层library java 虚拟机frameworkapplication 四组件活动(activity), 服务(service), 广播接收器(broadcast receiv ...

  7. 关于openssl的编译与使用

    关于openssl的编译与使用,可以参考这两往篇文章 http://blog.csdn.net/lazyclough/article/details/7456131 http://www.leaves ...

  8. CentOS7图形界面启动报错unable to connect to X server

    以前还可以正常启动图形界面,这次启动失败,报错unable to connect to X server 使用的是oracle用户,因为我是在oracle用户下创建的oracle数据库等 解决办法: ...

  9. ISD9160学习笔记03_ISD9160音频解码代码分析

    录音例程涉及了录音和播放两大块内容,这篇笔记就先来说说播放,暂且先击破解码这部分功能. 我的锤子便签中有上个月记下的一句话,“斯蒂芬·平克说,写作之难,在于把网状思考,用树状结构,体现在线性展开的语句 ...

  10. 解决3 字节的 UTF-8 序列的字节 3 无效

    maven项目编译正常,运行时候报以下错误: 3 字节的 UTF-8 序列的字节 3 无效 仔细看这个错误的详细信息,会发现是某个xml文件中字符识别的问题,解决办法如下: 在pom.xml中添加以下 ...