You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

XC8多UART实现类似CCS的fprintf输出示例求助

XC8 多UART指定串口输出实现示例

在XC8中,要实现类似CCS中通过STREAM指定UART输出的功能,需要借助标准库的FILE流和自定义字符输出函数,将不同UART的发送操作绑定到独立的文件流上,从而用fprintf实现指定串口输出。以下是针对PIC系列单片机的完整示例:

示例代码(以PIC16F18875为例)

#include <xc.h>
#include <stdio.h>

// 单片机配置(根据实际硬件调整)
#pragma config FOSC = INTOSC    // 内部振荡器
#pragma config WDTE = OFF       // 关闭看门狗
#pragma config PWRTE = ON       // 开启上电延时
#pragma config MCLRE = OFF      // MCLR引脚作为通用I/O
#pragma config CP = OFF         // 关闭代码保护
#pragma config CPD = OFF        // 关闭数据保护
#pragma config BOREN = ON       // 开启欠压复位
#pragma config CLKOUTEN = OFF   // 关闭CLKOUT引脚
#pragma config IESO = ON        // 开启内部/外部振荡器切换
#pragma config FCMEN = ON       // 开启故障时钟监视器

#define _XTAL_FREQ 16000000     // 16MHz系统时钟

// UART1初始化
void UART1_Init(void) {
    TRISCbits.TRISC6 = 0;       // TX1引脚设为输出
    TRISCbits.TRISC7 = 1;       // RX1引脚设为输入
    BAUDCON1bits.BRG16 = 0;     // 8位波特率发生器
    TXSTA1bits.BRGH = 1;        // 高速波特率模式
    SPBRG1 = 103;               // 16MHz下115200波特率
    TXSTA1bits.TXEN = 1;        // 使能UART1发送
    RCSTA1bits.SPEN = 1;        // 使能UART1串口
}

// UART2初始化
void UART2_Init(void) {
    TRISBbits.TRISB0 = 0;       // TX2引脚设为输出
    TRISBbits.TRISB1 = 1;       // RX2引脚设为输入
    BAUDCON2bits.BRG16 = 0;
    TXSTA2bits.BRGH = 1;
    SPBRG2 = 103;               // 115200波特率
    TXSTA2bits.TXEN = 1;        // 使能UART2发送
    RCSTA2bits.SPEN = 1;        // 使能UART2串口
}

// UART1字符发送函数,供FILE流调用
int UART1_putc(char c, FILE *stream) {
    while(!TXSTA1bits.TRMT);    // 等待发送缓冲区空
    TXREG1 = c;                 // 发送字符
    return c;
}

// UART2字符发送函数,供FILE流调用
int UART2_putc(char c, FILE *stream) {
    while(!TXSTA2bits.TRMT);    // 等待发送缓冲区空
    TXREG2 = c;                 // 发送字符
    return c;
}

// 定义两个FILE流,分别绑定到UART1和UART2
FILE UART1_STREAM = FDEV_SETUP_STREAM(UART1_putc, NULL, _FDEV_SETUP_WRITE);
FILE UART2_STREAM = FDEV_SETUP_STREAM(UART2_putc, NULL, _FDEV_SETUP_WRITE);

void main(void) {
    OSCCON = 0x70;              // 设置内部时钟为16MHz
    UART1_Init();
    UART2_Init();
    
    while(1) {
        fprintf(&UART1_STREAM, "\r\nUART1 Output");  // 指定UART1输出
        fprintf(&UART2_STREAM, "\r\nUART2 Output");  // 指定UART2输出
        __delay_ms(1000);       // 延时1秒
    }
}

关键说明

  • UART初始化:根据单片机型号调整引脚配置和波特率计算,确保硬件参数与实际需求匹配。
  • 自定义putc函数:每个UART对应一个字符发送函数,负责等待发送缓冲区空闲并写入字符,这是流输出的核心逻辑。
  • FILE流绑定:通过FDEV_SETUP_STREAM宏将自定义putc函数与FILE对象关联,_FDEV_SETUP_WRITE表示该流仅用于写操作。
  • fprintf调用:直接传入对应FILE流的地址,即可实现指定UART的字符串输出,效果与CCS中的fprintf(stream, ...)一致。

内容的提问来源于stack exchange,提问作者Josilmar Gonzalez

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 10:17:40