找回密码
 立即注册
查看: 44|回复: 3

请教:15W408AS串口无法通信问题

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-09-03 13:02:34
已绑定手机

1

主题

1

回帖

11

积分

新手上路

积分
11
发表于 4 天前 | 显示全部楼层 |阅读模式
自己写的程序通讯不上,又换了官方例程,还是通讯不上。

请问是什么原因?
串口助手接收不到数据。用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[RX1_Lenth];        //接收缓冲
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[TX1_Cnt];        //发一个字节
                                if(++TX1_Cnt >= RX1_Lenth)        TX1_Cnt = 0;        //避免溢出处理
                        }
                }
        }
}

/********************* UART1中断函数************************/
void UART1_int (void) interrupt UART1_VECTOR
{
        if(RI)
        {
                RI = 0;
                RX1_Buffer[RX1_Cnt] = SBUF;                //保存一个字节
                if(++RX1_Cnt >= RX1_Lenth)        RX1_Cnt = 0;        //避免溢出处理
        }

        if(TI)
        {
                TI = 0;
                B_TX1_Busy = 0;                //清除发送忙标志
        }
}






回复

使用道具 举报 送花

3

主题

1998

回帖

844

积分

等待验证会员

积分
844
发表于 4 天前 | 显示全部楼层
您好,感谢您的提问。关于您提到的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
  • 最近打卡:2025-09-03 13:02:34
已绑定手机

1

主题

1

回帖

11

积分

新手上路

积分
11
发表于 4 天前 | 显示全部楼层
用核心板的例程也试过,也是不能通信。
谁手上有这板吗?帮忙试一下?

/*----------------------------------------------------------   
* 项目名称:

     串口通信驱动程序

* 功能描述:

     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****************************************/


回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:551
  • 最近打卡:2025-09-07 07:40:03
已绑定手机

86

主题

6079

回帖

1万

积分

超级版主

积分
11197
发表于 3 天前 | 显示全部楼层
注意:15W408AS没有定时器1
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-9-7 21:25 , Processed in 0.128681 second(s), 68 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表