请教:15W408AS串口无法通信问题
自己写的程序通讯不上,又换了官方例程,还是通讯不上。请问是什么原因?
串口助手接收不到数据。用89C52和STC8H8K就能通讯成功。
这是芯片有什么特殊吗?
例程如下:
/*------------------------------------------------------------------*/
/* --- 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; //清除发送忙标志
}
}
您好,感谢您的提问。关于您提到的STC15W408AS串口无法通信的问题,以下为专业分析及建议:
首先,STC15W408AS是STC公司推出的一款基于增强型8051内核的单片机,具备较高的性能与丰富的外设资源。其串口通信功能与其他STC系列MCU(如STC8H8K、89C52)类似,但在配置和使用上存在一些差异,需特别注意。
一、可能原因分析
1. 串口初始化配置错误
STC15W408AS的串口配置与传统8051有所不同,尤其是波特率发生器和寄存器设置。若未正确配置SCON、PCON、UART模块相关寄存器,可能导致串口无法正常工作。例如:
SCON寄存器中模式选择(SM0/SM1)是否正确;
波特率是否设置合理(尤其在使用系统时钟分频时);
是否启用串口中断(ES位)及全局中断(EA位)。
2. 引脚配置问题
STC15W408AS的串口引脚(如P3.0/RX、P3.1/TX)可能被其他功能复用或未正确配置为通用IO。请确认:
引脚是否已设置为推挽输出(TX)或输入(RX);
是否存在其他外设占用该引脚(如定时器、ADC等);
是否需要通过P3M1/P3M2寄存器进行引脚模式设置。
3. 时钟源或波特率计算错误
STC15W408AS支持多种时钟源(内部RC、外部晶振、LPO等),不同频率下波特率计算方式不同。若未根据实际时钟频率重新计算波特率,将导致通信失败。建议使用官方提供的波特率计算器工具进行验证。
4. 硬件连接或电平不匹配
虽然您提到使用89C52和STC8H8K可以正常通信,但STC15W408AS的I/O电平可能与串口助手或其他设备不兼容。请检查:
串口通信线是否接反(如TX与RX接错);
是否使用了合适的电平转换电路(如MAX232、USB转TTL模块);
串口助手中是否选择了正确的COM端口和波特率。
5. 电源或复位异常
若芯片供电不稳定或复位电路设计不当,可能导致串口初始化失败。建议检查电源电压是否稳定,并确保复位引脚(RST)有足够长的上电延迟。
6. 软件逻辑问题
即使例程来自官方,也可能因环境配置(如编译器版本、头文件引用)或代码逻辑(如未发送数据、未等待缓冲区就绪)导致通信失败。建议:
使用调试工具(如STC-ISP、仿真器)观察寄存器状态;
添加调试输出(如LED指示灯)判断程序执行流程;
确保发送函数(如SBUF赋值)后等待TI标志置位。
二、建议操作步骤
1. 参考官方文档
请查阅《STC15W408AS数据手册》第7章“串口”部分,重点了解:
串口模式(Mode 0~3)的选择;
波特率计算公式(特别是使用系统时钟分频时);
引脚功能配置方法。
2. 使用标准例程验证
下载并运行STC官网提供的标准串口通信例程,确认是否能正常通信。若仍失败,可逐步排查硬件或配置问题。
3. 调试与测试
使用示波器或逻辑分析仪观测TX引脚是否有信号输出;
检查串口助手是否接收到数据(可通过“查看数据”或“十六进制显示”功能);
尝试更换不同的串口助手(如XCOM、SecureCRT)进行测试。
4. 咨询技术支持
若上述方法均未能解决问题,建议联系STC官方技术支持,提供详细代码、硬件连接图及测试结果,以便进一步定位问题。
三、总结
STC15W408AS串口通信问题可能由配置错误、硬件连接异常或软件逻辑缺陷引起。建议按照上述步骤逐一排查,并结合官方文档与调试工具进行验证。若您愿意提供具体代码片段或硬件连接信息,我可进一步协助分析。
如需,我可提供一份适用于STC15W408AS的标准串口通信示例代码供参考。
[本文内容由国芯人工智能辅助生成,仅供参考] 用核心板的例程也试过,也是不能通信。
谁手上有这板吗?帮忙试一下?
/*----------------------------------------------------------
* 项目名称:
串口通信驱动程序
* 功能描述:
1、串口初始化
2、查询法接收一个字节
3、串口发送一个字节
4、串口发送一个字符串
5、串口中断方式接收一个字符
* 配置说明:
MCU: STC15W408AS
开发板: STC15W408AS最小系统板
晶振: 内部时钟11.0592M
扩展模块: -
软件: Keil.C51.V9.01
* 备注:
- 将开发板的串口与电脑串口连接
----------------------------------------------------------*/
#include<STC15W.h>
#include<USART.h>
unsigned char *pchar; //定义一个全局指针
//----------------------------------------------------------
//函数名称:void IniSerialPort(void)
//函数功能:串口初始化
//----------------------------------------------------------
//void InitSerialPort(void)
//{
// SCON = 0x50; //8位数据,可变波特率
// AUXR |= 0x01;
// AUXR |= 0x04; //定时器时钟为Fosc,1T模式
// T2L = 0xE0; //定时器初值,内部时钟11.0592M,波特率9600
// T2H = 0xFE; //定时器初值
// AUXR |= 0x10; //启动定时器
// //ES=1; //串口中断开关,采用查询法时不用打开中断
// REN=1; //串口为工作方式1,允许接收数据
// SM0=0; //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定
// SM1=1;
//}
void InitSerialPort(void) //115200bps@11.0592MHz
{
SCON = 0x50; //8位数据,可变波特率
AUXR |= 0x01; //串口1选择定时器2为波特率发生器
AUXR |= 0x04; //定时器时钟1T模式
T2L = 0xE8; //设置定时初始值
T2H = 0xFF; //设置定时初始值
AUXR |= 0x10; //定时器2开始计时
REN=1; //串口为工作方式1,允许接收数据
SM0=0; //SM0 SM1串口工作方式选择,01:8位异步收发,波特率由定时器决定
SM1=1;
}
//----------------------------------------------------------
//函数名称:unsigned char ReceiveByte(void)
//函数功能:查询法接收一个字节
//----------------------------------------------------------
unsigned char ReceiveByte(void)
{
unsigned char rbyte;
while(!RI); //查询接收标志位,是否有数据到达缓冲区
RI=0; //清零接收标志位
rbyte=SBUF; //从缓冲区读取数据
return rbyte;
}
//----------------------------------------------------------
//函数名称:void SendByte(unsigned char sbyte)
//函数功能:串口发送一个字节
//----------------------------------------------------------
void SendByte(unsigned char sbyte)
{
SBUF=sbyte; //发送数据
while(!TI); //等待发送完成
TI=0; //清零发送标志位
}
//----------------------------------------------------------
//函数名称:void SendString(unsigned char *pstr)
//函数功能:串口发送一个字符串
//----------------------------------------------------------
void SendString(unsigned char *pstr)
{
while(*pstr!='\0') //字符串是否发完
{
SendByte(*pstr); //发送字符串数据
pstr++; //指向下一个字符
}
}
//----------------------------------------------------------
//函数名称:void SerialPortInte(void)
//函数功能:串口中断方式接收一个字符
//----------------------------------------------------------
void SerialPortInte(void) interrupt 4
{
RI=0; //清零接收标志位
*pchar=SBUF; //读取缓冲区的数据
P33 =1;
P34 =0;
}
/**********************************THE END**********************************/
/*--------------------------------------------------------------------------------
* 项目名称:
串口通信测试程序 V1.0.0
* 功能描述:
1、单片机通过查询的方式接收电脑发送过来的数据,将接收到的数据返回给电脑。
2、可以同时发送一个字符或一个字符串。
* 配置说明:
MCU: STC15W408AS
开发板: STC15W408AS最小系统板
晶振: 内部时钟11.0592M
扩展模块: -
软件: Keil.C51.V9.01
* 备注:
- 将开发板的串口与电脑串口连接
-------------------------------------------------------------------------------------*/
/************************包含头文件***************************************************/
#include<STC15W.h>
#include<USART.h>
void IOinit()
{
P0M0 = 0x00; P0M1 = 0x00;
P1M0 = 0x00; P1M1 = 0x00;
P2M0 = 0x00; P2M1 = 0x00;
P3M0 = 0x00; P3M1 = 0x00;
P4M0 = 0x00; P4M1 = 0x00;
P5M0 = 0x00; P5M1 = 0x00;
P6M0 = 0x00; P6M1 = 0x00;
P7M0 = 0x00; P7M1 = 0x00;
}
/************************主函数******************************************************/
void main()
{
unsigned char rdata=0;
IOinit();
InitSerialPort(); //初始化串口
while(1)
{
rdata=ReceiveByte(); //采用查询法接收数据
SendByte(rdata); //就把数据发回去
}
}
/*********************************The End****************************************/
注意:15W408AS没有定时器1
页:
[1]