中易网

STC12C5A单片机串口2接收数据给数组后,由串口1发送,反之也可以,求大神帮忙看看程序为啥不行?

答案:2  悬赏:50  
解决时间 2021-03-06 08:47
#include "STC12C5A.h"
#include "intrins.h"
#include "string.h"
#define uchar unsigned char
#define uint unsigned int
#define S2RI 0x01 //串口2接收中断请求标志位
#define S2TI 0x02 //串口2发送中断请求标志位
uchar xdata Data1_BUF[32],Data2_BUF[32];
uchar flag1,flag2,temp1,temp2;
uint m=0,n=0;
void delay(void)
{ uint j,g;
for(j=0;j<500;j++)
for(g=0;g<500;g++);
}
void Uart_Init (void)
{
SCON=0x50; //串口1工作方式1,
TMOD=0x20; //定时器1为工作方式2
TH1=0xFD; //产生9600bps
TL1=0xFD;
TR1=1;
S2CON=0x50; //工作方式一,允许接收
BRT=0xFD;
AUXR1=0x10;
AUXR=0x10;
IE2=0x01;
flag1=flag2=0;
ES=1;
EA=1;
}

void UART1_SendOneByte(uchar c)
{
SBUF = c;
while(!TI);
TI = 0;
}
void UART2_SendOneByte(uchar c)
{ S2BUF = c;
while(!(S2CON&S2TI));
S2CON&=~S2TI;
}
void UART1_SendString(char *p)
{ while(* p)
UART1_SendOneByte(*p++);
}
void UART2_SendString(char *p)
{
while(* p)
UART2_SendOneByte(*p++);
}

void UART_1Interrupt(void) interrupt 4
{ if(RI==1)
{ RI=0;
if(SBUF!='\0')
{ Data1_BUF[m++]=SBUF;}
else
{ flag1=1;
Data1_BUF[m]='\0';
m=0;
}
}
}

void UART_2Interrupt(void) interrupt 8
{
if(!(S2CON&S2RI))
{ S2CON&=~S2RI;
if(S2BUF!='\0')
{ Data2_BUF[n++]=S2BUF;}
else
{ flag2=1;
Data2_BUF[n]='\0';
n=0;
}
}
}

void main(void)
{ Uart_Init();
while(1);
{ if(flag1==1)
{ flag1=0;
UART2_SendString(Data1_BUF);
}
if(flag2==1)
{ flag2=0;
UART1_SendString(Data2_BUF);
}
}
}
最佳答案
先确定2个串口独立发送都能接到数据
然后在其中一个串口接到数据的时候 在接收中断里开启另外一个串口的发送
这样是最直接的转发模式

如果先接收一个字符串 再启用发送 有可能会造成冲突的情况

如果有显示设备的话
可以写一个检测程序 显示单片机的运行状况
全部回答
#include &quot;include.h&quot; uchar databuff[20]; uint pin,pout; //串口1用于将系统采集到的信息发送给pc或路由 void uart1_init() { scon=0x50;//串口方式1,允许接收 tmod=0x21;//定时器1的方式2,定时器0的方式1 th1=0xfd;//gps接受信号波特率4800 //9600 tl1=0xfd;// pcon|=0x00; tr1=1;//启动定时器1 ren=1; // 允许接收 es=1; //允许串口中断 ea=1; // 开总中断 } void uart1_sendbyte(uchar i) { es=0;//发送数据时关中断 ti=0; sbuf=i; while(ti==0); ti=0; es=1; } void uart1_receive(void) interrupt 4 { uchar uc; if(ri) { ri=0; es=0;//接收数据时关闭串口中断 uc=sbuf; uart1_sendbyte(uc);//串口1将数据发给串口2 databuff[pin]=uc; pin++; if(pin&gt;20) pin=0; } // ri=1; // es=1; //开串口中断 } //串口2用于接收gps信号 void uart2_init() { s2con=0x50;//方式2 允许接受 brt=0xfd;// 设置波特率9600 auxr|=0x10;//允许波特率发生器运行 auxr1&amp;=0xef;//s2_p4=0 将uart2切换到p1口 ie2|=0x01;// 允许串口2中断 } void uart2_sendbyte(uchar i) { es=0; s2buf=i;// uart2发送数据 while((s2con&amp;0x02)!=0x02); // s2con&amp;=~0x02; // es=1; } void uart2_receive(void) interrupt 8 { uchar a; uint k=0; a=s2con&amp;0x01; if(a==1) { k=s2buf; s2con&amp;=0xfe; uart1_sendbyte(k); // gps(k);//将串口接收到的信息交给gps处理程序 s2con&amp;=0xfd; } // else // s2con&amp;=0xfd; // 清0 s2ri } void uart_printf(char a,uchar *p) { if(a==1) { while(*p!=&apos;\0&apos;) uart1_sendbyte(*p++); } if(a==2) { while(*p!=&apos;\0&apos;) uart2_sendbyte(*p++); } } 你好,你看一下这一个,我改的,正在用。。。希望对你有帮助
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
我吱吱吱吱叫,打一个水果名。
鑫源边三轮骑行方向抖动历害?主车整体向左偏
清流县三明中国福利彩票地址有谁知道?有点事
牛客来地址在什么地方,想过去办事
坐过了补票在火车上啥意思?
河南哪里好?
泡沫之夏第二集中,淑儿唱的那首歌叫什么名字
开学一个星期作文老师我想对你说初一六百字.
让……一直……吧!照样子写句子
在北京广安门医院预约了5天后的B超,然后我把
男女生谈恋爱到底是为了什么?彼此有什么目的
Open和hen、dress、desk的发音是否相同?
合肥海洋世界和紫蓬山笑翻天乐园那个好玩
富士照相馆地址有知道的么?有点事想过去
广东深圳市龙岗区清林中路219龙岗中专邮政编
推荐资讯
想请大伙帮个忙做个诗,我可没钱,只能衷心说
dnf深渊不出东西啊,连续两天满PL的深渊就今
创世纪网咖在什么地方啊,我要过去处理事情
南坪哪里配眼镜性价比高
大桥焊条地址在哪,我要去那里办事
梦幻西游69级的魔方寸和69级的普陀这两个哪个
圆柱体的侧面展开得到一个正方形,这时圆柱底
堰锦路/师古桥东路(路口)地址在哪,我要去那
我的RNA-Seq数据,101bp大小。测序公司给我1.
怎样才能让我的英语脱口而出
派出所结案是什么意思
拉肚子 胃不舒服 老打嗝
手机登qq时,显示手机磁盘不足,清理后重新登
刺客的套装怎么选啊?