PIC18F4620经FT232向CoolTerm传输UART仅收到FF、FE的故障求助
提问内容
正在实现PIC18F4620单片机通过FT232芯片向CoolTerm串口工具传输数据的功能,当前仅能接收到来自PIC端的0xFF、0xFE两个数据值。已确认RX、TX引脚正确交叉连接,连接线缆接触正常,对照数据手册核对后认为波特率配置无问题,希望得到排查建议。测试时任意选择数值51作为测试值,更换其他任意数字或字母测试,接收结果均相同。
附图包括:电路实物图、CoolTerm界面截图。
const unsigned char MSG0[] = "Transmitting... "; const unsigned char MSG1[] = "Sent:"; const unsigned char MSG2[] = "TEST:"; // Subroutine Declarationsb #include <pic18.h> // Subroutines #include "lcd_portd.c" #include <delays.h> #include <plib.h> #include <stdint.h> void UART_TX_Init(void) { BRG16 = 0; BRGH = 1; // Set For High-Speed Baud Rate SPBRG = 64; // Set The Baud Rate To Be 9600 bps //--[ Enable The Ascynchronous Serial Port ]-- SYNC = 0; SPEN = 1; //--[ Set The RX-TX Pins to be in UART mode (not io) ]-- TRISC6 = 1; // As stated in the datasheet TRISC7 = 1; // As stated in the datasheet TXEN = 1; // Enable UART Transmission } void UART_Writes(uint8_t data) { while(!TRMT); TXREG = data; } // Main Routine void main(void) { UART_TX_Init(); unsigned int result = 0; unsigned int i; uint8_t data = 51; TRISA = 0; TRISC = 0; TRISB = 0; TRISD = 0; TRISE = 0; TRISA = 0; TRISB = 0x00; PORTC = 0; PORTD = 0; PORTE = 0; ADCON1 = 0x0F; LCD_Init(); // initialize the LCD LCD_Move(0,0); for (i=0; i<20; i++) LCD_Write(MSG0[i]); Wait_ms(100); LCD_Move(1,0); for (i=0; i<5; i++) LCD_Write(MSG1[i]); while(1) { Wait_ms(1000); UART_Writes(data); LCD_Move(1,5); LCD_Out(data,3,0); } }
排查方案
- 优先核对波特率计算逻辑:你使用
BRG16=0、BRGH=1的异步高速UART模式,对应波特率计算公式为实际波特率 = FOSC / (16 * (SPBRG + 1))。当前设置SPBRG=64仅当单片机主振荡频率FOSC=10MHz时才能输出标准9600bps。如果实际使用的晶振不是10MHz(比如常用的8/16/20MHz),实际输出波特率会和CoolTerm设置的9600bps偏差极大,而0xFF/0xFE正是波特率严重不匹配时的典型接收结果(空闲串口为高电平,错误采样会被识别为全1帧,即0xFF,偶尔采样到错误起始位会得到0xFE)。如果实际用16MHz晶振,要输出9600bps需要把SPBRG改为103。 - 检查寄存器配置覆盖问题:在
UART_TX_Init()中你按要求将TRISC6(UART_TX引脚)设为1,但在main函数中又执行了TRISC = 0,直接把整个PORTC的方向全部设为输出,覆盖了UART引脚的配置。建议删掉TRISC = 0这一行,避免外设被误修改。 - 核对振荡器配置位:除了硬件晶振本身,还要检查芯片的配置位(Configuration Bits)的振荡器模式设置,比如是否配置为对应外部晶振的模式、是否启用了PLL倍频。如果配置位选了内部RC振荡器,和实际硬件不匹配,实际运行的FOSC会和预期完全不同,直接导致波特率计算错误。
- 确认CoolTerm串口参数:除了波特率9600,还要核对数据位(默认8位)、停止位(默认1位)、校验位(默认无),任意参数不匹配都会导致接收异常。
- 硬件波形验证:用示波器或逻辑分析仪抓取RC6引脚的输出波形,发送数据时如果抓不到高低电平跳变,说明UART外设未正常使能;如果能抓到波形,但每位的持续时间和9600bps对应的104us不符,直接定位为波特率配置问题。
- 调整初始化顺序:将
ADCON1 = 0x0F(关闭模拟通道)的操作移到main函数最开头,所有外设初始化之前执行,避免引脚处于模拟模式时被误配置。
内容的提问来源于stack exchange,提问作者Petertk
相关产品推荐
相关产品推荐

