STC15双串口printf调试输出案例
Posted perseverance52
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15双串口printf调试输出案例相关的知识,希望对你有一定的参考价值。
STC15双串口printf调试输出案例
-
✨本案例基于库函数开发,通过对库函数案例修改而来。如果所选单片机型号ROM比较小,那么就不要这么做。
-
🔖所选单片机型号:
STC15F2K60S2
,晶振频率22.1184
MHz -
🌿串口1:P30,P31;
-
🌿串口2:P10,P11
-
📖工程架构
-
Mul_Serial_Printf.c
文件
#include "Mul_Serial_Printf.h"
void Usart_printf(int USARTx, char *fmt, ...)
static unsigned char Usartx_TxBuff[200];
unsigned int i, length;
va_list ap; //va_list 可变参数列表,存参数地址
va_start(ap, fmt); //获取可变参数地址 fmt地址赋给ap
/*使用参数列表发送格式化输出到字符串,函数功能将可变参数格式化输出到一个字符数组*/
vsprintf((char *)Usartx_TxBuff, fmt, ap); //fmt中内容赋给Usart3_TxBuff
va_end(ap); //清空参数列表
length = strlen((const char *)Usartx_TxBuff);
// 此时,Usartx_TxBuff 是要发送的字符串,length是字符串的长度
// 在这里写串口发送代码,和判断串口号的逻辑代码
if (USARTx == 1)
// 如果是串口1,调用串口1的发送代码
for (i = 0; i < length; i++)
SBUF = Usartx_TxBuff[i];
while (!TI); //等待发送完毕
TI = 0;
else if (USARTx == 2)
// 如果是串口2
for (i = 0; i < length; i++)
S2BUF = Usartx_TxBuff[i];
while (!TI2); //等待发送完毕
CLR_TI2();
Mul_Serial_Printf.h
文件
#ifndef Mul_Serial_Printf_H
#define Mul_Serial_Printf_H
#include "stdarg.h"
#include "string.h"
#include "config.h"
#include <stdio.h>
void Usart_printf(int USARTx, char *fmt, ...);
#endif
主程序代码
/*------------------------------------------------------------------*/
/* --- STC MCU International Limited -------------------------------*/
/* --- STC 1T Series MCU RC Demo -----------------------------------*/
/* --- Mobile: (86)13922805190 -------------------------------------*/
/* --- Fax: 86-0513-55012956,55012947,55012969 ---------------------*/
/* --- Tel: 86-0513-55012928,55012929,55012966 ---------------------*/
/* --- Web: www.GXWMCU.com -----------------------------------------*/
/* --- QQ: 800003751 ----------------------------------------------*/
/* If you want to use the program or the program referenced in the */
/* article, please specify in which data and procedures from STC */
/*------------------------------------------------------------------*/
#include "config.h"
#include "USART.h"
#include "delay.h"
#include "Mul_Serial_Printf.h"
/************* 功能说明 **************
双串口全双工中断方式收发通讯程序。
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
/************* 本地常量声明 **************/
/************* 本地变量声明 **************/
/************* 本地函数声明 **************/
/************* 外部函数和变量声明 *****************/
void UART_config(void)
COMx_InitDefine COMx_InitStructure; //结构定义
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BRT_Use = BRT_Timer1; //使用波特率, BRT_Timer1, BRT_Timer2 (注意: 串口2固定使用BRT_Timer2)
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 一般 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.BaudRateDouble = DISABLE; //波特率加倍, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART1_SW_P30_P31; //切换端口, UART1_SW_P30_P31,UART1_SW_P36_P37,UART1_SW_P16_P17(必须使用内部时钟)
COMx_InitStructure.UART_RXD_TXD_Short = DISABLE; //内部短路RXD与TXD, 做中继, ENABLE,DISABLE
USART_Configuration(USART1, &COMx_InitStructure); //初始化串口1 USART1,USART2
COMx_InitStructure.UART_Mode = UART_8bit_BRTx; //模式, UART_ShiftRight,UART_8bit_BRTx,UART_9bit,UART_9bit_BRTx
COMx_InitStructure.UART_BaudRate = 115200ul; //波特率, 110 ~ 115200
COMx_InitStructure.UART_RxEnable = ENABLE; //接收允许, ENABLE或DISABLE
COMx_InitStructure.UART_Interrupt = ENABLE; //中断允许, ENABLE或DISABLE
COMx_InitStructure.UART_Polity = PolityLow; //中断优先级, PolityLow,PolityHigh
COMx_InitStructure.UART_P_SW = UART2_SW_P10_P11; //切换端口, UART2_SW_P10_P11,UART2_SW_P46_P47
USART_Configuration(USART2, &COMx_InitStructure); //初始化串口2 USART1,USART2
Usart_printf(1, "Hello STC15F2K60S2 USART1!");//串口1输出
Usart_printf(2, "Hello STC15F2K60S2 USART2!");//串口2输出
// PrintString1("STC15F2K60S2 UART1 Test Prgramme!\\r\\n"); //SUART1发送一个字符串
// PrintString2("STC15F2K60S2 UART2 Test Prgramme!\\r\\n"); //SUART2发送一个字符串
/**********************************************/
void main(void)
u8 i;
UART_config();
EA = 1;
while (1)
delay_ms(1);
if (COM1.RX_TimeOut > 0) //超时计数
if (--COM1.RX_TimeOut == 0)
if (COM1.RX_Cnt > 0)
for (i = 0; i < COM1.RX_Cnt; i++) TX1_write2buff(RX1_Buffer[i]); //收到的数据原样返回
COM1.RX_Cnt = 0;
if (COM2.RX_TimeOut > 0) //超时计数
if (--COM2.RX_TimeOut == 0)
if (COM2.RX_Cnt > 0)
for (i = 0; i < COM2.RX_Cnt; i++) TX2_write2buff(RX2_Buffer[i]); //收到的数据原样返回
COM2.RX_Cnt = 0;
📚双串口中断收发(printf打印)程序源码
复制这段内容后打开百度网盘手机App,操作更方便哦
链接: https://pan.baidu.com/s/1BjxsOXNd0xM1KTZBCuzDXw
提取码: ea94
以上是关于STC15双串口printf调试输出案例的主要内容,如果未能解决你的问题,请参考以下文章
STC单片机利用scanf和printf串口输入输出调试测试