我会想你的 发表于 2020-11-11 15:32:16

以解决STC115F2K32S2,新手 串口打印字符串“1234”,打印“12345” 乱码,不知什么原因

本帖最后由 我会想你的 于 2020-11-12 08:55 编辑

问题找到了,是我开了全局中断,注释了就可以,谢谢各位大佬帮忙

c语言小白,串口打印字符串“1234”,打印“12345” 乱码,不知什么原因?哪位大佬可以帮我看下?
我使用的单片机是STC115F2K32S2
烧写时我晶振使用的是22.1184MHz

代码如下:
#include<STC15F.h>
#include<string.h>


#define MAIN_Fosc                                                                22118400L                //主时钟,晶振频率不同的直接在这里修改频率
#define serial_one_baud_rate                115200L                        //波特率,只需在这里修改波特率就可以了
#define        Timer1_Reload                                                (65536UL -(MAIN_Fosc / 4 / serial_one_baud_rate))           //用定时器1做波特率发生器,计算定时器1的重装值       

unsigned char Table[]="12345";
unsigned char Buff;//数据缓冲区
sbit KEY=P3^2;

//发送数据函数
void SEND_data(unsigned char *Buff)
{
unsigned char j;
        unsigned char lenth=0;
   lenth=strlen(Buff);//计算数据长度
        for(j=0;j<lenth;j++)//发送数据
{
SBUF=Buff;   
while(TI==0);
TI=0;
}
}      
//延时1ms函数
void delay_1ms(unsigned int t)
{
unsigned int x,y;
for(x=t;x>0;x--)
for(y=110;y>0;y--);
}
//缓冲区初始化
void Buff_init()
{
unsigned char n;    //将Table里的数据放到缓冲区里
for(n=0;n<16;n++)
{
Buff= Table;
delay_1ms(100);
}
}
//串口初始化函数
void serial_init()
{
        SCON |= 0x40;                                //8位数据
        TR1 = 0;                                        //关闭定时器
        TMOD &= 0x0F;                //设定定时器1为16位自动重装方式
        AUXR |= 0x40;                //定时器1时钟为Fosc,即1T
        AUXR &= 0xFE;                //串口1选择定时器1为波特率发生器
        TH1 = (u8)(Timer1_Reload >> 8);
        TL1 = (u8)Timer1_Reload;
        TR1= 1;                                        //打开定时器
        PS = 1;        //高优先级中断
        REN = 1;        //允许接收
        ES= 1;        //允许中断
        EA = 1;                //允许全局中断
}


void main()
{
        unsigned char i;
Buff_init();
serial_init();
while(1)
{
        if(KEY==0)
        {
                  while(!KEY);
      SEND_data(Buff);
                        delay_1ms(1000);
}
}
}

takashiki 发表于 2020-11-12 08:08:36

我会想你的 发表于 2020-11-12 07:52
中断开了还没有用

是哪本教材诉你没有用的?这不误人子弟嘛。发送一个字节后会进入中断,但你没有ISR程序不得跑飞。要么就别开中断,开了就要有配套的ISR,哪怕ISR什么也不操作。

chenchaoting 发表于 2020-11-11 16:43:46

看看是不是接收到的HEX 就错了,错了单片机到接收的问题

takashiki 发表于 2020-11-11 17:36:01

串口中断你开启了,中断服务程序在哪呢?

智涅 发表于 2020-11-11 18:05:48

lenth打印看看

jxcrgt35 发表于 2020-11-11 22:12:51

你的这种方式不需开启串口中断。查询法判断TI即可。

street 发表于 2020-11-11 22:30:55

串口助手, 切换到 hex 模式看看

我会想你的 发表于 2020-11-12 07:52:46

takashiki 发表于 2020-11-11 17:36
串口中断你开启了,中断服务程序在哪呢?

中断开了还没有用

我会想你的 发表于 2020-11-12 07:54:43

智涅 发表于 2020-11-11 18:05
lenth打印看看

lenth 打印出来会加 1 位 我昨天重新学了下 数组 因为有 “\0”

lb0857 发表于 2020-11-12 08:01:46

hex   和文本的差别{:loveliness:}

我会想你的 发表于 2020-11-12 08:03:27

智涅 发表于 2020-11-11 18:05
lenth打印看看

打印出来lenth后发现第一次数据是对的 ,后面就是错的

我会想你的 发表于 2020-11-12 08:52:45

takashiki 发表于 2020-11-12 08:08
是哪本教材诉你没有用的?这不误人子弟嘛。发送一个字节后会进入中断,但你没有ISR程序不得跑飞。要么就 ...

大佬,是我表达的不清楚,我的意思是我没有使用中断,现在我也找到问题了,是你说的,发送数据后进入中断了,总的来说是我开了全局中断,谢谢
页: [1]
查看完整版本: 以解决STC115F2K32S2,新手 串口打印字符串“1234”,打印“12345” 乱码,不知什么原因