STC15-串口通信打印输出数据printf函数与sprintf函数

STC15-串口通信打印输出数据printf函数与sprintf函数

该问题引用百度知道下面该出处的链接:

https://zhidao.baidu.com/question/403268801.html

用串口1输出数据时遇到的问题:

1.打印输出数据有二种printf函数与sprintf函数,不同之处有:

(1)函数的声明不同

c 复制代码
int printf(const char *format [, argument]...);
int sprintf(char *buffer, const char *format [, argument] ...);

sprintf比printf多一个参数buffer,这个参数的作用见(2)的描述。

(2)函数的功能不同

函数printf(...)根据指定的格式(format)将参数(argument)输出到屏幕上;

函数sprintf(...)根据指定的格式(format)将参数(argument)输出到由指针buffer指定的字符数组(字符缓冲区)中;

(3)用法举例

c 复制代码
#include <stdio.h>
void main()
{
  /*字符数组buffer用于存放sprintf函数的输出*/
  char buffer[256]; 
  int x = 100;
  char *message = "Hello world";
   
  /* 用sprintf函数将x和message输出到字符数组buffer中 */
  sprintf(buffer, "%s%d", message, x);
   
  /* 用printf函数将buffer的内容输出到屏幕上显示 */
  printf("%s\n", buffer);   
}

粘贴上STC15串口初始化代码:

c 复制代码
/***************************************************************************
 * 描  述 : 串口1初始化函数  
 * 入  参 : 无
 * 返回值 : 无
备注:波特率9600bps   晶振11.0592MHz
 **************************************************************************/
void Uart1_Init(void)
{	
	P_SW1&=0X3F;     //选择P30 P31为串口1
	
	PCON &= 0x3f;		//波特率不倍速,串行口工作方式由SM0、SM1决定
	SCON = 0x50;		//8位数据,可变波特率,启动串行接收器
	AUXR |= 0x40;		//定时器1时钟为Fosc,即1T
	AUXR &= 0xfe;		//串口1选择定时器1为波特率发生器
	TMOD &= 0x0f;		//清除定时器1模式位
	TMOD |= 0x20;		//设定定时器1为8位自动重装方式
	TL1 = 0xDC;		  //设定定时初值
	TH1 = 0xDC;		  //设定定时器重装值
	ET1 = 0;		    //禁止定时器1中断
	TR1 = 1;		    //启动定时器1
	ES = 1;         // 串口1中断打开

}

/***************************************************************************
 * 描  述 : 串口1发送数据函数
 * 入  参 : uint8 数据
 * 返回值 : 无
 **************************************************************************/
void SendDataByUart1(uint8 dat)
{
    SBUF = dat;                 //写数据到UART数据寄存器
		while(TI == 0);             //在停止位没有发送时,TI为0即一直等待
		TI = 0;                     //清除TI位(该位必须软件清零)
}

/***************************************************************************
 * 描  述 : 串口1发送字符串函数
 * 入  参 : uint8 *s 待发送字符串 
 * 返回值 : 无
 **************************************************************************/
void SendStringByUart1(uint8 *s)
{
	while(*s)
	{
		SendDataByUart1(*s++);       //将字符串中的字符一个一个发送
	}
}

/***************************************************************************
 * 描  述 : 重定向c库函数printf到USART1
 * 入  参 : char dat
 * 返回值 : char 
 **************************************************************************/
char putchar(char dat)
{
		SendDataByUart1(dat);           
		return dat;                    
}



/***************************************************************************
 * 描  述 : 串口1中断服务函数
 * 入  参 : 无
 * 返回值 : 无
 **************************************************************************/
void Uart1() interrupt UART1_VECTOR using 1
{
	ES = 0;  	                  // 串口1中断关闭

	if (RI)                     //串行接收到停止位的中间时刻时,该位置1
  {
      RI = 0;                 //清除RI位 (该位必须软件清零)
   }
   if (TI)                    //在停止位开始发送时,该位置1
   {
      TI = 0;                 //清除TI位(该位必须软件清零)
   }
	 ES =  1;                   // 串口1中断打开
}

/*********************************END FILE********************************************/	

下面简介各个寄存器的作用

1.串行口1的控制寄存器SCON和PCON




2.串行口数据缓冲寄存器SBUF

3.辅助寄存器AUXR

4.定时器2的寄存器T2H,T2L

5.从机地址控制寄存器SADEN和SADDR

6.与串行口1中断相关的寄存器位ES和PS

7.将串口1进行切换的寄存器AUXR1(P SW1)

8.串口1的中继广播方式设置位一Tx_Rx/CLK_DIV4

相关推荐
月阳羊1 天前
【硬件-笔试面试题-95】硬件/电子工程师,笔试面试题(知识点:RC电路中的时间常数)
java·经验分享·单片机·嵌入式硬件·面试
芜狄1 天前
UCOSIII移植——学习笔记1
笔记·嵌入式硬件·学习·stm32f103rct6·ucosiii实时操作系统
小莞尔1 天前
【51单片机】【protues仿真】基于51单片机数控直流稳压电源系统
c语言·stm32·单片机·嵌入式硬件·51单片机
小莞尔1 天前
【51单片机】【protues仿真】基于51单片机密码锁系统
c语言·stm32·单片机·嵌入式硬件·51单片机
黑不拉几的小白兔1 天前
stm32教程:USART串口通信
stm32·单片机·嵌入式硬件
sheepwjl1 天前
《嵌入式硬件(十二):基于IMX6ULL的时钟操作》
汇编·arm开发·单片机·嵌入式硬件·时钟·.s编译
智者知已应修善业1 天前
【51单片机单按键控制2个LED循环闪烁】2022-12-7
c语言·经验分享·笔记·嵌入式硬件·51单片机
物随心转1 天前
ARM的TrustZone
嵌入式硬件
风_峰1 天前
PuTTY软件访问ZYNQ板卡的Linux系统
linux·服务器·嵌入式硬件·fpga开发
田甲1 天前
【STM32】串口的阻塞、中断、DMA收发
stm32·单片机·嵌入式硬件