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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 02:27:01