STM32同时使用多个串口,使用printf

  1. 前言:
    项目中正好用到多个串口对不同的上位机输出数据,正好就折腾一下STM32多串口同时使用。
    实际使用后,还是使用的是分时串口发送,没有用中断发送,因为我要使用printf,用中断,担心有函数重入的问题,没有这样尝试。
    我为啥要写这个呢,因为网上写的这些,都不符合我的需求,我就想用printf格式化输出,但是网上居然有自己去解析格式的做法,我看了一下,也就是把常用的几个解析了,并没有做到真正的和printf一样。
  2. 正文
    先贴代码, 代码内容就是初始化串口。这个很好理解。
    bsp_usart.c
/**
  ******************************************************************************
  * @file    bsp_usart.c
  * @author  zhouxing
  * @version V1.0
  * @date    2020-08-31
  * @brief   重定向c库printf函数到usart端口
  */ 

#include "bsp_usart.h"

USART_TypeDef * DEBUG_USARTx = USART1;   //定义串口指针

 /**
  * @brief  USART GPIO 配置,工作参数配置
  * @param  无
  * @retval 无
  */
void USART_Config(void)
{
    
    uart1_init(115200);
    uart2_init(115200);
    uart3_init(115200);
}

/*****************  发送一个字符 **********************/
void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)
{
   
	/* 发送一个字节数据到USART */
	USART_SendData(pUSARTx,ch);
		
	/* 等待发送数据寄存器为空 */
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

/*****************  发送字符串 **********************/
void Usart_SendString( USART_TypeDef * pUSARTx, char *str)
{
   
	unsigned int k=0;
  do 
  {
   
      Usart_SendByte( pUSARTx, *(str + k) );
      k++;
  } while(*(str + k)!='\0');
  
  /* 等待发送完成 */
  while(USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET)
  {
   }
}

/*****************  发送一个16位数 **********************/
void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)
{
   
	uint8_t temp_h, temp_l;
	
	/* 取出高八位 */
	temp_h = (ch&0XFF00)>>8;
	/* 取出低八位 */
	temp_l = ch&0XFF;
	
	/* 发送高八位 */
	USART_SendData(pUSARTx,temp_h);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);
	
	/* 发送低八位 */
	USART_SendData(pUSARTx,temp_l);	
	while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);	
}

///重定向c库函数printf到串口,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
   
		/* 发送一个字节数据到串口 */
		USART_SendData(DEBUG_USARTx, (uint8_t) ch);
		
		/* 等待发送完毕 */
		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_TXE) == RESET);		
	
		return (ch);
}

///重定向c库函数scanf到串口,重写向后可使用scanf、getchar等函数
//int fgetc(FILE *f)
//{
   
//		/* 等待串口输入数据 */
//		while (USART_GetFlagStatus(DEBUG_USARTx, USART_FLAG_RXNE) == RESET);

//		return (int)USART_ReceiveData(DEBUG_USARTx);
//}
    
/*******************************************************************************  
* 函 数 名         : uart_init  
* 函数功能         : IO端口及串口1,时钟初始化函数    TX PA9,RX PA10    
* 输    入         : 无  
* 输    出         : 无  
*******************************************************************************/    
void uart1_init(u32 bt)    
{
       
    GPIO_InitTypeDef GPIO_InitStructure;    //声明一个结构体变量,用来初始化GPIO    
    NVIC_InitTypeDef NVIC_InitStructure
  • 34
    点赞
  • 229
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值