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
相关产品推荐
相关产品推荐

