找回密码
 立即注册
查看: 393|回复: 15

串口收发出现乱码

[复制链接]
  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-20 15:42:40
已绑定手机

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-1-20 15:32:24 | 显示全部楼层 |阅读模式
我使用的是stc8h8k64u核心板,使用默认的P3.0,P3.1使用为串口1,P1.0,P1.1为串口2。当串口1收到数据后会发送给串口2,同样的串口2收到的数据也会发给串口1。现在遇到的问题是我发送10条数据里面会有3-4条数据是乱码,或者数据有缺失。而且有时候还会出现核心板复位。 截图202501201531474824.jpg

以下是代码:


//#include "reg51.H"
#include "intrins.h"
#include <STC8H.H>



#define FOSC 11059200
#define BRT (65536-FOSC/115200/4)
#define MAX 128

#define                TI2                                        (S2CON & 2)
#define                RI2                                        (S2CON & 1)
#define                SET_TI2()                        S2CON |=  (1<<1)
#define                CLR_TI2()                        S2CON &= ~(1<<1)
#define                CLR_RI2()                        S2CON &= ~1

/*
sfr AUXR=0x8e;

sfr P1M1=0x91;
sfr P1M0=0x92;
sfr P0M1=0x93;
sfr P0M0=0x94;
sfr P2M1=0x95;
sfr P2M0=0x96;
sfr P3M1=0xb1;
sfr P3M0=0xb2;
sfr P4M1=0xb3;
sfr P4M0=0xb4;
sfr P5M1=0xb9;
sfr P5M0=0xca;
*/

bit busy;
char wptr;
char rptr;
char wptr2;
char rptr2;
extern unsigned char buffer[MAX];
extern unsigned char buffer2[MAX];


void Delay250us(void)        //@11.0592MHz
{
        unsigned char data i, j;

        _nop_();
        i = 3;
        j = 173;
        do
        {
                while (--j);
        } while (--i);
}



void UartIsr() interrupt 4
{
        if(TI)
        {
                TI=0;
                busy=0;
        }
        if(RI)
        {
                RI=0;
                buffer[wptr++]=SBUF;
                if(wptr>=MAX)
                {
                        wptr=0;
                }
        }
}


void UartIsr2() interrupt 8
{
        if(TI2)
        {
                CLR_TI2();
                busy=0;
        }
        if(RI2)
        {
                CLR_RI2();
                buffer2[wptr2++]=S2BUF;
                if(wptr2>=MAX)
                {
                        wptr2=0;
                }
        }
}


void UartInit()
{
        SCON=0x50;
        TMOD=0x00;
        TL1=BRT;
        TH1=BRT>>8;
        TR1=1;
        AUXR=0x54;
        wptr=0x00;
        rptr=0x00;
       
        S2CON=0x10;
        TL2=BRT;
        TH2=BRT>>8;
        //TR2=1;
        wptr2=0x00;
        rptr2=0x00;
        busy=0;
}

void UartSend(char dat)
{
        while(busy);
        busy=1;
        SBUF=dat;
}

void UartSend2(char dat)
{
        while(busy);
        busy=1;
        S2BUF=dat;
}

void UartSendStr(char *p)
{
        while(*p)
        {
                UartSend(*p++);
        }
}

void main()
{
        P0M0=0x00;
        P0M1=0x00;
        P1M0=0x00;
        P1M1=0x00;
        P2M0=0x00;
        P2M1=0x00;
        P3M0=0x00;
        P3M1=0x00;
        P4M0=0x00;
        P4M1=0x00;
        P5M0=0x00;
        P5M1=0x00;
       
        UartInit();
        ES=1;
        IE2=0X01;
        EA=1;
        UartSendStr("Hello World\r\n");
       
        while(1)
        {
                //UartSendStr("Hello World\r\n");
                if(rptr!=wptr)
                {
                        UartSend2(buffer[rptr++]);
                        if(rptr>=MAX)
                        {
                                rptr=0;
                        }
                }
                //串口2收到数据往串口1发数据
                if(rptr2!=wptr2)
                {
                        UartSend(buffer2[rptr2++]);
                        if(rptr2>=MAX)
                        {
                                rptr2=0;
                        }
                }
                Delay250us();
        }
}

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:435
  • 最近打卡:2025-04-30 08:43:23

33

主题

2351

回帖

4860

积分

论坛元老

积分
4860
发表于 2025-1-20 16:10:22 | 显示全部楼层
busy标志分开写?
参考例程并不是对技术参 考手册的补充,而是对技术参 考手册的解释。
技术参 考手册不应该需要参考例程作为补充,而是解释成了参考例程的样子
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-20 15:42:40
已绑定手机

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-1-20 16:25:18 | 显示全部楼层
_奶*** 发表于 2025-1-20 16:10
busy标志分开写?

busy标志位我是看着官网文档里的写的,我不知道这么写对不对,可以麻烦指导一下应该写在哪里吗
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-20 16:26:24 | 显示全部楼层
不能用同一个busy标志
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-20 16:27:05 | 显示全部楼层
rub*** 发表于 2025-1-20 16:25
busy标志位我是看着官网文档里的写的,我不知道这么写对不对,可以麻烦指导一下应该写在哪里吗 ...

两个busy,
busy1
busy2
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-20 15:42:40
已绑定手机

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-1-20 16:40:36 | 显示全部楼层
Ayb_*** 发表于 2025-1-20 16:27
两个busy,
busy1
busy2

你好,现在单片机不会出现复位了,但是数据接收有时候还是会出现乱码
截图202501201638064704.jpg
是不是rptr和wptr的清除有问题,我现在给的buffer的长度是128,用的是外部的扩展内存。 截图202501201639447573.jpg 截图202501201640184638.jpg
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看II
  • 打卡总天数:20
  • 最近打卡:2025-04-28 16:56:43

21

主题

376

回帖

2345

积分

超级版主

积分
2345
发表于 2025-1-20 16:47:29 | 显示全部楼层
用范例测试下:
串口相关程序.zip (298.25 KB, 下载次数: 17)



电话:0513-55012946 QQ:2195591714  微信:  19952583740
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:38
  • 最近打卡:2025-04-29 08:28:25
已绑定手机

17

主题

446

回帖

1173

积分

金牌会员

积分
1173
发表于 2025-1-20 16:47:37 | 显示全部楼层
你这逻辑不好,1发往2,2发往1,理论上会死循环
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-20 15:42:40
已绑定手机

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-1-20 16:50:36 | 显示全部楼层
Ayb_*** 发表于 2025-1-20 16:27
两个busy,
busy1
busy2

还是出现了复位的情况,我换了波特率也不行
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:1
  • 最近打卡:2025-01-20 15:42:40
已绑定手机

3

主题

9

回帖

35

积分

新手上路

积分
35
发表于 2025-1-20 16:52:31 | 显示全部楼层

范例程序我之前试过了没问题的,不过范例程序全部都是调用库写的,和我现在的写法不太一样
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 13:10 , Processed in 0.127218 second(s), 110 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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