找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 903|回复: 3
打印 上一主题 下一主题
收起左侧

求助:STC32G单片机使用printf函数串口发送数据失败

[复制链接]
跳转到指定楼层
楼主
请教各位大神:
      近期学习STC32G12K128单片机,使用printf函数发送数据失败了。原程序在STC其它系列的8位机上运行均没有问题。按理说,在STG32上运行时,只要把头文件更换即可,但是为什么串口不能通讯呢?恳请指点,谢谢大家!     使用串口1通讯,定时器1为波特率发生器,上位机发送字符v,单片机回发各种字符,代码如下:

/*试验printf串口发送字符*/
#include<STC32G.H>
# include<stdio.h>
#include "intrins.h"
//# include<reg52.h>
//# include "STC12C5A60S2.h"

void ConfigUART(unsigned int baud);
unsigned char RxdByte = 0x00;

void printstar()
{
        printf("********************************\n");
}

void print_message()
{
        printf("hello world");                   //
        printf("How do you do!\n");
        printf("欢迎学习STC51单片机\n");
}


void main()
{
        ConfigUART(9600);                                  //配置T1波特率为9600
        EA=1;
        WTST = 0;    //CPU读取储存器的等待时间控制
        EAXFR = 1;   //使能访问XFR
       CKCON = 0x00;  //外部数据总线为最快


        while(1)
        if (RxdByte == 'v')                                 //v代表有数据请求
       {
                 RxdByte=0;                                    //清零
                ES=0;                                                //可以不要
                TI=1;                                            //TI必须置1
                printf("学习STG32单片机\n");
                printstar();
                print_message();
                printstar();               
                TI=0;                                           //此程序中可以不要
                ES=1;                                           //可以不要
        }
        else
        {
        }
}

/* 串口配置函数,baud-通信波特率 */
void ConfigUART(unsigned int baud)
{
    SCON  = 0x50;                                                          //配置串口为模式1
    TMOD &= 0x0F;                                                      //清零T1的控制位
    TMOD |= 0x20;                                                          //配置T1为模式2,波特率发生器
    TH1 = 256 - (11059200/12/32)/baud;          //计算T1重载值
    TL1 = TH1;                                                             //初值等于重载值
    ET1 = 0;                                                               //禁止T1中断
    ES  = 1;                                                          //使能串口中断
    TR1 = 1;                                                       //启动T1
}

/* UART中断服务函数 */
void InterruptUART() interrupt 4
{
    if (RI)                                                                  //接收到字节
    {
        RI = 0;                                                          //清零接收中断标志位
        RxdByte = SBUF;                    //接收到的数据保存到接收字节变量中
    }          
}


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1034262 发表于 2024-9-21 23:00 | 只看该作者
你那拿老51的程序放在STC32G上要修改一下的,建议从STC官方下载例程测试学习。
回复

使用道具 举报

板凳
ID:161164 发表于 2024-9-22 10:57 | 只看该作者
你都没有重定向putchar, 怎么会成功?

回复

使用道具 举报

地板
ID:1111014 发表于 2024-9-28 11:59 | 只看该作者
感谢大家指点,现已解决。主要是存在两个问题:
1)C251编译设置有问题,应该把Momory Model的设置为:XSmall:near vars,far const,prt-4。
2)STC32G里,串口1默认T2作为波特率发生器,如果使用T1作为波特率发生器,应关闭T2的波特率设置位,即S1BRT = 0。
重定向putchar,还没有试,再次感谢!
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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