rubnun 发表于 2025-1-20 15:32:24

串口收发出现乱码

我使用的是stc8h8k64u核心板,使用默认的P3.0,P3.1使用为串口1,P1.0,P1.1为串口2。当串口1收到数据后会发送给串口2,同样的串口2收到的数据也会发给串口1。现在遇到的问题是我发送10条数据里面会有3-4条数据是乱码,或者数据有缺失。而且有时候还会出现核心板复位。

以下是代码:


//#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;
extern unsigned char buffer2;


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=SBUF;
                if(wptr>=MAX)
                {
                        wptr=0;
                }
        }
}


void UartIsr2() interrupt 8
{
        if(TI2)
        {
                CLR_TI2();
                busy=0;
        }
        if(RI2)
        {
                CLR_RI2();
                buffer2=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);
                        if(rptr>=MAX)
                        {
                                rptr=0;
                        }
                }
                //串口2收到数据往串口1发数据
                if(rptr2!=wptr2)
                {
                        UartSend(buffer2);
                        if(rptr2>=MAX)
                        {
                                rptr2=0;
                        }
                }
                Delay250us();
        }
}

_奶咖君_ 发表于 2025-1-20 16:10:22

busy标志分开写?

rubnun 发表于 2025-1-20 16:25:18

_奶咖君_ 发表于 2025-1-20 16:10
busy标志分开写?

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

Ayb_ice 发表于 2025-1-20 16:26:24

不能用同一个busy标志

Ayb_ice 发表于 2025-1-20 16:27:05

rubnun 发表于 2025-1-20 16:25
busy标志位我是看着官网文档里的写的,我不知道这么写对不对,可以麻烦指导一下应该写在哪里吗 ...

两个busy,
busy1
busy2

rubnun 发表于 2025-1-20 16:40:36

Ayb_ice 发表于 2025-1-20 16:27
两个busy,
busy1
busy2

你好,现在单片机不会出现复位了,但是数据接收有时候还是会出现乱码

是不是rptr和wptr的清除有问题,我现在给的buffer的长度是128,用的是外部的扩展内存。

32G12K128 发表于 2025-1-20 16:47:29

用范例测试下:




Ayb_ice 发表于 2025-1-20 16:47:37

你这逻辑不好,1发往2,2发往1,理论上会死循环

rubnun 发表于 2025-1-20 16:50:36

Ayb_ice 发表于 2025-1-20 16:27
两个busy,
busy1
busy2

还是出现了复位的情况,我换了波特率也不行

rubnun 发表于 2025-1-20 16:52:31

32G12K128 发表于 2025-1-20 16:47
用范例测试下:

范例程序我之前试过了没问题的,不过范例程序全部都是调用库写的,和我现在的写法不太一样
页: [1] 2
查看完整版本: 串口收发出现乱码