STC15双串口printf调试输出案例

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STC15双串口printf调试输出案例相关的知识,希望对你有一定的参考价值。

STC15双串口printf调试输出案例


  • ✨本案例基于库函数开发,通过对库函数案例修改而来。如果所选单片机型号ROM比较小,那么就不要这么做。

  • 🔖所选单片机型号: STC15F2K60S2,晶振频率22.1184MHz

  • 🌿串口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串口输入输出调试测试

STC单片机不同数据类型串口打印输出示例程序

STC15STC15单片机获取红外解码从软串口输出

STC15利用库函数实现printf和scanf重载示例模板

STC15不同配置模式下的串口输出方式总结

STC15不同配置模式下的串口输出方式总结