单片机串口通信,能够发送,不能接收是什么问题,哪个大侠知道??急急
我想问下,实现两块单片机的串口通信是将两个单片机的10,,11交叉连,10(1)--11(2),11(1)--10(2),发送时通过查询发送的,用串口调试助手看是可以发送...
我想问下,实现两块单片机的串口通信是将两个单片机的10,,11交叉连,10(1)--11(2),11(1)--10(2),发送时通过查询发送的,用串口调试助手看是可以发送成功的,但是接受总是接受不到,接受是用中断接受,相关的程序是:
void UART_init() //串口初始化,波特率与发送单片机的是一样的
{
SCON=0x50; //串口模式 1,允许接收
TMOD=0x20; //T1 工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd; //波特率设定: 9600
TL1=0xfd;
TI=RI=0;
TR1=1;//启动定时器T1
IE=0x90; //允许串口中断
//EA=1;
//ES=1;
}
void serial_int() interrupt 4 //乙机串口接收中断函数
{
EA=0;
if(RI)
{ RI=0;
rec_buf=SBUF;
lcd_pos(4,0);
lcd_wdat(rec_buf);
}
EA=1;
}
发送成功,接受一直没有,用查询方式接受也没有,RI一直是为0的,有人知道是为什么吗?
串口中断是不是只要发成功,接受方中断有开,有中断服务程序就行啦,是不?没有什么验证码的吧。 展开
void UART_init() //串口初始化,波特率与发送单片机的是一样的
{
SCON=0x50; //串口模式 1,允许接收
TMOD=0x20; //T1 工作模式2
PCON=0x00; //波特率不倍增
TH1=0xfd; //波特率设定: 9600
TL1=0xfd;
TI=RI=0;
TR1=1;//启动定时器T1
IE=0x90; //允许串口中断
//EA=1;
//ES=1;
}
void serial_int() interrupt 4 //乙机串口接收中断函数
{
EA=0;
if(RI)
{ RI=0;
rec_buf=SBUF;
lcd_pos(4,0);
lcd_wdat(rec_buf);
}
EA=1;
}
发送成功,接受一直没有,用查询方式接受也没有,RI一直是为0的,有人知道是为什么吗?
串口中断是不是只要发成功,接受方中断有开,有中断服务程序就行啦,是不?没有什么验证码的吧。 展开
3个回答
展开全部
有可能你的主程序中有点问题,你加一个死循环试试,死等接收。
while(1);
while(1);
追问
主程序有一个while(){};
void main()
{
int ii;
lcd_init();
UART_init();
delay(10); //延时
/* ii = 0;
while(dis1[ii] != '\0')
{ //显示字符
lcd_wdat(dis1[ii]);
ii++;
} */
lcd_pos(1,1);
lcd_wdat(rec_buf);
while(1)
{
}
}
有加了,
追答
while(1)
{
; //这个分号必须加,否则跟没有一样。
}
其实可以直接 while(1);
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
请在初始化时EA = 1;因为你不打开就不会中断。
疏忽了中断服务程序在你原来的基础上加上下面的语句就行,但是还有个问题就是我评论里面说的。
if(TI == 1)
TI = 0;
疏忽了中断服务程序在你原来的基础上加上下面的语句就行,但是还有个问题就是我评论里面说的。
if(TI == 1)
TI = 0;
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
void serial_int() interrupt 4 //乙机串口接收中断函数
{
EA=0;
RI = 0;
rec_buf=SBUF;
lcd_pos(4,0);
lcd_wdat(rec_buf);
EA=1;
}
感觉你都进入接收中断了,没必要还在接收中断服务程序种在去查询
{
EA=0;
RI = 0;
rec_buf=SBUF;
lcd_pos(4,0);
lcd_wdat(rec_buf);
EA=1;
}
感觉你都进入接收中断了,没必要还在接收中断服务程序种在去查询
追问
大神啊,按你说的这样后,它神奇般的可以了,不过发送字符8,接受到时x,为啥嘞,知道不!
追答
把波特率设为1200 试试吧
有示波器的话,可以看一下波形
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询