最近做一个串口调试试验,想实现从上位机(串口调试助手)中发送一窜字符,单片机产生中断 接收到后将其存储在一个数组里,最后主函数里检测到中断标志,再将该字符串返回到上位机(串口调试助手)。 但是 调试时发现在上位机中 只有连续发送一窜字符超过5次,单片机才能将其完整的返回,前几次只返回前两位字符,而且每次发送都是返回两次,小弟实在是不明白怎么回事,希望大侠您帮一下。
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar b=1;uint i,j;
uchar table1[30];
uchar table[]="return ";
uchar count,flag;
void DelayMs(uint ms)
{ uint i; while(ms--)
{
for(i = 0; i < 120; i++);
}
}
void main()
{
flag=0;
TMOD=0x21;
SCON=0x50;
TH0=(65536-50000)/256;
TL0=(65536-50000)%256;
TH1=0xfd;
TL1=0xfd;
TR1=1;
ET0=1;
SM0=0;
SM1=1;
REN=1;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0;
for(i=0;i<6;i++)
{
SBUF=table;
while(!TI);
TI=0;
}
while(flag==1)
{
flag=0;
for(i=0;i<30;i++)
{
SBUF=table1;
while(!TI);
TI=0;
}
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
DelayMs(250);
ES=1;
// flag=0;
count=0;
// while(1);
}
}
}
}
void ISRSER() interrupt 4 using 3 //串口中断
{ // RI=0;// for(i=0;i<10;i++)// {// table1=SBUF;// } // P1=SBUF;// b=1; void ISRSER() interrupt 4 using 3 //串口中断
EA=0; //关中断,防止其它中断打扰
if (RI)
{
table1[count] = SBUF;
count++;
flag=1;
RI=0;
}
EA=1;
//恢复中断
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
很乱。
首先你上位机就是按照字节发送的,因此单片机也需要按字节接收,实际上不按字节接收也不可能,因为SBUF就是一个8位〔一个字节〕的寄存器,一旦接收够8个,接收中断就置位,等下一个字节的起始位就清空,准备下一个字节的接收。
楼主跟我以前的思维很像,我曾经写过SBUF=cache[512]
最好的办法就是按照楼上的做,接一个发一个。
你的意思是不是说.如果发一个字符串abc
那SBUF第一次 接收一个a
第二次接收一个b...
一共接收3次啊...
我理解的对吗
一周热门 更多>