串口收发出现乱码
我使用的是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();
}
}
busy标志分开写? _奶咖君_ 发表于 2025-1-20 16:10
busy标志分开写?
busy标志位我是看着官网文档里的写的,我不知道这么写对不对,可以麻烦指导一下应该写在哪里吗 不能用同一个busy标志 rubnun 发表于 2025-1-20 16:25
busy标志位我是看着官网文档里的写的,我不知道这么写对不对,可以麻烦指导一下应该写在哪里吗 ...
两个busy,
busy1
busy2
Ayb_ice 发表于 2025-1-20 16:27
两个busy,
busy1
busy2
你好,现在单片机不会出现复位了,但是数据接收有时候还是会出现乱码
是不是rptr和wptr的清除有问题,我现在给的buffer的长度是128,用的是外部的扩展内存。
用范例测试下:
你这逻辑不好,1发往2,2发往1,理论上会死循环 Ayb_ice 发表于 2025-1-20 16:27
两个busy,
busy1
busy2
还是出现了复位的情况,我换了波特率也不行 32G12K128 发表于 2025-1-20 16:47
用范例测试下:
范例程序我之前试过了没问题的,不过范例程序全部都是调用库写的,和我现在的写法不太一样
页:
[1]
2