找回密码
 立即注册

QQ登录

只需一步,快速开始

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

STC8G单片机串口通讯疑问,每次只能发送一个字节正确数据问题

[复制链接]
跳转到指定楼层
楼主
STC8G单片机使用printf()函数发送数据,出现错乱现象:
void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d%d%d",e,f,g); //接收中断后 回传1 2 3
                          ES=1;
                }
}



只能收到e=1,后面的字节收不到;切换到HEX模式,则还是有错误:


31的asc码是1,A6和FE明显是错误显示;


现在把发送分成3次,程序如下,但发现还是有错误:
void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d",e);
                        printf("%d",f);
                        printf("%d",g);
                          ES=1;
                }
}



非常奇怪,只能发送一个字节出去;


单片机选用型号是STC8G2K64S4,属于1T单片机,晶振设置的是22.1184MHZ,波特率是19200,完整程序如下,跪求各路大神解惑,谢谢!
#include "reg51.h"
#include"stdio.h"
#include "intrins.h"


#define  CKSEL  (*(unsigned char volatile xdata *)0xfe00)           //时钟相关寄存器地址
#define  CLKDIV  (*(unsigned char volatile xdata *)0xfe01)
#define  HIRCCR  (*(unsigned char volatile xdata *)0xfe02)
#define  XOSCCR  (*(unsigned char volatile xdata *)0xfe03)
#define  IRC32KCR  (*(unsigned char volatile xdata *)0xfe04)


sfr  P_SW2  =  0xba;   //特殊寄存器
sfr  AUXR  =  0x8e;
sfr  P0M1  =  0x93;//管脚配置寄存器地址 与通讯无关
sfr  P0M0  =  0x94;
sfr  P1M1  =  0x91;
sfr  P1M0  =  0x92;
sfr  P2M1  =  0x95;
sfr  P2M0  =  0x96;
sfr  P3M1  =  0xb1;
sfr  P3M0  =  0xb2;
sfr  P4M1  =  0xb3;
sfr  P4M0  =  0xb4;
sfr  P5M1  =  0xc9;
sfr  P5M0  =  0xca;


int K=0;


void UartInit()//串口初始化函数
{
PCON=0x00;                   //PCON=0X00 波特率不加倍         SMOD=0
SCON = 0x50;        //SM0=0 SM1=1 串口1模式1可变波特率  8位数据模式
TMOD = 0x20;          //定时器1模式2  8位自动重装载模式
TL1 =0xDC;          //1T模式  22.1184MHZ晶振下  19200波特率
TH1 =0xDC;
IE=0x90;// 等同于EA=1;ES=1;
TCON=0x40;//等同于  TR1=1;
TI=1;
AUXR = 0x40;   //串口1模式0的波特率不加倍        选择定时器1作为波特率发射器
}


void main()
{
P_SW2 = 0x80;//首先选择内部时钟
CKSEL = 0x00;  // 选择内部 IRC (  默认 )   22.1184MHZ
//CLKDIV = 0x02;  // 时钟 2 分频
P_SW2 = 0x00;


UartInit();


while (1)
        {
                if(K==1)
                ;
                if(K==2)
                 ;
        }
}


void UartIsr() interrupt 4
{
        int d=0,e=1,f=2,g=3;
        if (RI)
                {
                        ES=0;
                        RI = 0;
                        printf("%d",e);
                        printf("%d",f);
                        printf("%d",g);
                          ES=1;
                }
}



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

使用道具 举报

沙发
ID:804115 发表于 2020-7-16 13:23 | 只看该作者
两个问题:
1. 你的串口发送如果选择hex的话,就不能填1了吧,应该填31吧!这个你再核对下。可以下载sscom试试。
2. 这个很重要:中断中不能执行耗时太长的任务,否则会对整个系统造成影响。
你在串口中断中调用printf就不行,因为printf太耗时了,如果你要做回环测试的话,将中断收到的数据先放到一个全局变量的数组中暂时存起来,等退出中断后,在大循环中判断是否收到数据,如果收到数据,则将收到的数据用printf打印出来。这样就不会出现只能收到1字节的问题了。如果你已经这样改了,还不能收到,那么就是你的中断响应太慢了,这时候就要降低波特率来降低中断触发的速度。

评分

参与人数 1黑币 +40 收起 理由
admin + 40 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

板凳
ID:800866 发表于 2020-7-18 15:44 | 只看该作者
重定义 printf函数功能 ,即fputc函数
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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