STC15-串口通信打印输出数据printf函数与sprintf函数
- 1.打印输出数据有二种printf函数与sprintf函数,不同之处有:
- (1)函数的声明不同
- (2)函数的功能不同
- (3)用法举例
该问题引用百度知道下面该出处的链接:
https://zhidao.baidu.com/question/403268801.html
用串口1输出数据时遇到的问题:
1.打印输出数据有二种printf函数与sprintf函数,不同之处有:
(1)函数的声明不同
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)用法举例
#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串口初始化代码:
/***************************************************************************
* 描 述 : 串口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