求救!!串口通讯异常
求救!!!将从官网下载的例程 “STC15系列库函数与例程测试版V2.0\例程\06-串口1中断收发\C语言” 编译下载到板子上后,用串口助手发命令,有数据返回,但返回的数据不对,这是什么情况?发→◇AA 00 00 □
收←◆FE 80 00
发→◇AA 01 01 □
收←◆FE 80 00
我使用的是芯片型号是STC15W20S ,下载和通讯口都是P3.0和P3.1
建议上传工程,并检查串口助手“更多串口设置”里的数据位、校验位、停止位设置。
建议单片机上电时主动发送一串数据,用于检验其波特率是否准确。 lcwswust 发表于 2026-1-6 10:54
建议上传工程,并检查串口助手“更多串口设置”里的数据位、校验位、停止位设置。
建议单片机上电时主动发 ...
/*------------------------------------------------------------------*/
/* --- 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 */
/*------------------------------------------------------------------*/
/************* 功能说明 **************
串口1全双工中断方式收发通讯程序。本例程使用22.1184MHZ时钟,如要改变,请修改下面的"定义主时钟"的值并重新编译。
串口设置为:115200,8,n,1.
通过PC向MCU发送数据, MCU收到后通过串口把收到的数据原样返回.
******************************************/
/************* 本地常量声明 **************/
#define MAIN_Fosc 22118400L //定义主时钟
#define RX1_Lenth 32 //串口接收缓冲长度
#define BaudRate1 115200UL //选择波特率
#define Timer1_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 1 重装值, 对应300KHZ
#define Timer2_Reload (65536UL -(MAIN_Fosc / 4 / BaudRate1)) //Timer 2 重装值, 对应300KHZ
#include "STC15Fxxxx.H"
/************* 本地变量声明 **************/
u8 idata RX1_Buffer; //接收缓冲
u8 TX1_Cnt; //发送计数
u8 RX1_Cnt; //接收计数
bit B_TX1_Busy; //发送忙标志
/************* 本地函数声明 **************/
/**********************************************/
void main(void)
{
B_TX1_Busy = 0;
RX1_Cnt = 0;
TX1_Cnt = 0;
S1_8bit(); //8位数据
S1_USE_P30P31(); //UART1 使用P30 P31口 默认
// S1_USE_P36P37(); //UART1 使用P36 P37口
// S1_USE_P16P17(); //UART1 使用P16 P17口
/*
TR1 = 0; //波特率使用Timer1产生
AUXR &= ~0x01; //S1 BRT Use Timer1;
AUXR |=(1<<6); //Timer1 set as 1T mode
TH1 = (u8)(Timer1_Reload >> 8);
TL1 = (u8)Timer1_Reload;
TR1= 1;
*/
AUXR &= ~(1<<4); //Timer stop 波特率使用Timer2产生
AUXR |= 0x01; //S1 BRT Use Timer2;
AUXR |=(1<<2); //Timer2 set as 1T mode
TH2 = (u8)(Timer2_Reload >> 8);
TL2 = (u8)Timer2_Reload;
AUXR |=(1<<4); //Timer run enable
REN = 1; //允许接收
ES= 1; //允许中断
EA = 1; //允许全局中断
while (1)
{
if(TX1_Cnt != RX1_Cnt) //收到过数据
{
if(!B_TX1_Busy) //发送空闲
{
B_TX1_Busy = 1; //标志发送忙
SBUF = RX1_Buffer; //发一个字节
if(++TX1_Cnt >= RX1_Lenth) TX1_Cnt = 0; //避免溢出处理
}
}
}
}
/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
if(RI)
{
RI = 0;
RX1_Buffer = SBUF; //保存一个字节
if(++RX1_Cnt >= RX1_Lenth) RX1_Cnt = 0; //避免溢出处理
}
if(TI)
{
TI = 0;
B_TX1_Busy = 0; //清除发送忙标志
}
} lcwswust 发表于 2026-1-6 10:54
建议上传工程,并检查串口助手“更多串口设置”里的数据位、校验位、停止位设置。
建议单片机上电时主动发 ...
就是直接用的例程,我是想要用例程先验证一下串口通讯 串口助手的配置 penghui 发表于 2026-1-6 11:30
串口助手的配置
下载时有没有修改时钟 penghui 发表于 2026-1-6 11:27
/*------------------------------------------------------------------*/
/* --- STC MCU Internationa ...
我未下载过这个例程,所以需要看代码才知道流程。
代码暂未发现问题,程序看起来就是收到啥就发啥。
考虑一下在while(1)之前发送一串数据。
目前怀疑是波特率有差异,建议检查STC-ISP下载时,是否有调节IRC频率为22.1184MHz。
或者用示波器测一下发送数据波形看波特率是否准确。
可能是波特率或时钟不匹配
建议使用ISP软件的串口助手
lcwswust 发表于 2026-1-6 12:03
我未下载过这个例程,所以需要看代码才知道流程。
代码暂未发现问题,程序看起来就是收到啥就发啥。
考 ...
感谢,下载时将ISP的IRC频率改成22.1184M就可以了 DebugLab 发表于 2026-1-6 12:50
可能是波特率或时钟不匹配
建议使用ISP软件的串口助手
是时钟不匹配,下载时在ISP上改IRS的频率就好了
页:
[1]