串口收发多字节问题
时间:10-02
整理:3721RD
点击:
PC通过串口助手向单片机发送aa 01 bb 指令,如果单片机收到指令后验证是否发来aa 01 bb,若是返回四个字节的数据。
#include<reg52.h>
#include<intrins.h>
unsigned char i;
unsigned char ch[5];
unsigned char flag;
void serial_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
EA=1;
ES=1;
TR1=1;
PS=1;
}
void sendN()
{ ES=0;
if((ch[0]==170)&&(ch[1]==1)&&(ch[2]==0xbb))
{ SBUF=187;
while(TI==0);
TI=0;
_nop_();
SBUF=04;
while(TI==0);
TI=0;
_nop_();
SBUF=03;
while(TI==0);
TI=0;
_nop_();
SBUF=221;
while(TI==0);
TI=0;
_nop_();
}
ES=1;
flag=1;
}
main()
{
serial_init();
while(1)
{
if(flag==2)
sendN();
}
}
void rec(void) interrupt 4
{
if(RI)
{
ch[i]=SBUF;
i++;
if(i==3)
{
i=0;
flag=2;
}
}
RI=0;
}
可是PC发aa 01 bb后 ,串口助手接收区没反应,即收不到任何数据。不知道是什么情况,求指教。
还有就是当我在sendN()函数中把if语句改为if((ch[0]==0xaa)&&(ch[1]=1)),即判断两个字节时,就能收到数。不知道为什么?
#include<reg52.h>
#include<intrins.h>
unsigned char i;
unsigned char ch[5];
unsigned char flag;
void serial_init()
{
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
SCON=0x50;
PCON=0x00;
EA=1;
ES=1;
TR1=1;
PS=1;
}
void sendN()
{ ES=0;
if((ch[0]==170)&&(ch[1]==1)&&(ch[2]==0xbb))
{ SBUF=187;
while(TI==0);
TI=0;
_nop_();
SBUF=04;
while(TI==0);
TI=0;
_nop_();
SBUF=03;
while(TI==0);
TI=0;
_nop_();
SBUF=221;
while(TI==0);
TI=0;
_nop_();
}
ES=1;
flag=1;
}
main()
{
serial_init();
while(1)
{
if(flag==2)
sendN();
}
}
void rec(void) interrupt 4
{
if(RI)
{
ch[i]=SBUF;
i++;
if(i==3)
{
i=0;
flag=2;
}
}
RI=0;
}
可是PC发aa 01 bb后 ,串口助手接收区没反应,即收不到任何数据。不知道是什么情况,求指教。
还有就是当我在sendN()函数中把if语句改为if((ch[0]==0xaa)&&(ch[1]=1)),即判断两个字节时,就能收到数。不知道为什么?
((ch[0]==0xaa)&&(ch[1]=1)),少了个等于号,还有你定义的是ch[5]所以如果你是连续发送的话空格也会被表示一个字符发送.自己注意逻辑关系.
您好,现在可以返回数据了,就是有一个问题:我把单片机断电,然后重新上电(此时串口助手不关闭),再发指令就不返回;当我把串口助手关了在打开,就能返回了。这是什么情况?按您说的改为ch[3]也是不行。
当你用串口助手发送第一个字节后 单片机断电 然后再上电 你再发送后面的字节 此时收到的数据就全乱了
在多字节接收的时候在你的串口中断函数里面加上字节判断
学习一下!
来找资料!
顶啊顶!谢谢分享!
不错。值得学习!
小编你好 ,你的帖子对我的帮助很大,谢了
