看了51单片机的串口通信,有一些疑问??

来自:    更新日期:早些时候
51单片机串口通信中断的问题~

肯定不会运行while(TI==0);下面的程序的,因为你的中断开着,程序跳到中断服务程序里面了,然后中断处理结束了之后,TI自动清零了,所以一直在while(TI==0);无限循环。

程序里面,既然开通了中断功能,那你就一直使用中断功能,为什么你还要使用查询功能呢?甚至有时把中断给禁止了,这里面容易出现问题哈。
你不要使用查询功能,就一直使用中断,具体程序查看下面:
#include
#define uint unsigned int
#define uchar unsigned char
void delay(int z);
char a,flag;

void main()
{
EA=1;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
ET1=0;
TR1=1;

ES=1;
REN=1;
SM0=0;
SM1=1;
while(1);
}
void ser_interrupt()interrupt 4
{
if(RI==1)
{
RI=0;
a=SBUF; //P1口接的发光二极管,以此查看接收到的数据
P1=a;
SBUF=a;
}

else if(TI==1)TI=0;

}

#include
#define uchar unsigned char
#define uint unsigned int
uchar idata trdata[]={'R','I','C','H','M','C','U','R','Z','-','5','1','V','2','.','0',0x0d,0x0a,0x00};
sbit K1=P3^2; //对应开发板K1按键
/*-------------------------------------------------------------*/
//串口初始化
void UART_Init(void)
{
SCON = 0x50; //串口工作方式为1 , 串行允许接收
//SM0=0;
//SM1=1;
//REN=1;
TMOD = 0x20; //定时器1 工作在方式2
//PCON = 0x80; //SMOD = 1; 波特率加倍
TH1 = 0xfd; //波特率 9600bps fosc="11".0592MHz
TL1 = 0xfd;
ES = 1; //开串口中断
TR1 = 1; //允许定时器1工作
EA = 1; //开总中断
}

void delay1ms(uint i)
{
uchar j;
while(i--)
{
for(j=0;j<115;j++) //1ms基准延时程序
{
;
}


}
}

/*-------------------------------------------------------------*/
//串口发送一个字节
void Uart_SendChar(unsigned char dat)
{
SBUF = dat; //待发送的数据写入缓冲区
while(!TI); //等待发送完成
TI = 0; //清零发送标志位
}

/*-------------------------------------------------------------*/
//串口发送一个字符串
void Uart_SendString()
{ uchar
i=0;
while(trdata[i]!=0x00)
{
SBUF=trdata[i];
while(!TI);
TI=0;
i++;
}
}


/*-------------------------------------------------------------*/
//主函数
void main(void)
{
UART_Init(); //初始化串口
while(1)
{
if(K1==0)
{
delay1ms(20);
if(K1==0)
{
Uart_SendString(); //发送数据
while(!K1); //等待按键释放
}
}
}
}

/*-------------------------------------------------------------*/
//串口接收中断函数
void INT_UartRcv(void) interrupt 4
{
unsigned char Rcv = 0;
if(RI) //查询接收标志位(有数据发送过来时置为1)
{
RI = 0; //接收标志位清零
Rcv = SBUF; //存储缓冲区的数据
P0=SBUF;
Uart_SendChar(Rcv); //让从计算机上传到单片机的数据 , 传回的计算机显示
}
}

你讲得有道理。但实际应用中一般不会出现这个情况,因为发送和接收都是"有约在先",因为接收方知己知彼,会考虑到这个因素,也知道帧与帧之间的最小间隔。
通常数据都是一帧一帧地发送的,接收方收到数据后并存于事先开辟的缓冲空间。
当收到标志性的数据后即时转移这些数据,并腾出事先开辟的缓冲空间接收后面的数据。程序在处理数据的同时,串口依然在接收,将接收的数据再次存于已经腾出的缓冲空间。
所以在串口中断服务中,不能有太多的程序去处理,因为处理这数据时,串口被中断占用就不能接收数据。通常将需要处理的数据放到主程序中,因为前面说了,主程序和串口接收是可以同时运行的。
如果在串口中断服务中,程序较多,占去太多时间,正如你说的,那就会丢帧而出错,这是不允许的。

电脑是一帧一帧发的,.....
--------------
楼主说的太快了,是一位一位发的。发送一帧,至少有十位。
按照波特率计算一下,就可以知道,发送过来一帧,时间是相当长的。
只要单片机程序编写的合理,处理完一帧,是不用这么长时间的。

硬件无应答信号,可以软件应答,不要在中断中处理,实际上是一个字节一个字节的接收,硬件不丢失,处理不过来,软件抛弃新数据,或直接不用旧数据,使用新数据

用中断做没问题的,只有一帧数据发送完后,才会产生中断,才能发送另外一帧数据的....


看了51单片机的串口通信,有一些疑问??视频

相关评论:
  • 1535536790151单片机的串行通信有哪几种格式
    陈侍吴串行口分四种工作方式,由SCON中的SMO、SM1二位选择决定。1.方式0 (1)特点 1.用作串行口扩展,具有固定的波特率,为Fosf\/12。2.同步发送\/接收,由TXD提供移位脉冲,RXD用作数据输入\/输出通道。3.发送\/接收8位数据,低位在先。(2)发送操作 当执行一条“MOV SBUF,A”指令时,启动发送操作,由...

  • 1535536790151单片机中串口通信在哪个端口,有没有固定的。。
    陈侍吴51单片机中的串口通信是通过P3口的两个引脚(即P3.0和P3.1)实现的,其中P3.0口为串口接收引脚(RXD),P3.1口为串口发送引脚(TXD)。在51单片机中,串口通信的端口是固定的,即P3.0口和P3.1口。这两个引脚通过串口通信电路与串口通信芯片相连,实现串口通信功能。需要注意的是,在使用51单...

  • 15355367901单片机串口通信需要用哪些寄存器
    陈侍吴51单片机串口工作时,涉及到以下三个寄存器:1.scon——串行口工作寄存器 2.ie——中断允许寄存器(如果用到中断方式的话)3.pcon——其中最高位smod与波特率有关 另外定时器有t0和t1,而t1在方式1,方式3时需要用到,以改变波特率。

  • 1535536790151单片机的串口通信,每一次是不是只能发送一个字节,比如说12,是分两次...
    陈侍吴如果你想发的是数字‘12’,那么可以直接发‘12’(0x0C)。串口一次只能接收8个位(当然可以设置成 9个位),也就是 一次通讯 1Byte 数据。

  • 1535536790151单片机串口问题
    陈侍吴一看你的提问就知道你是刚接触单片机这玩意 单片机的串口通信是需要自己编写程序的,不是你想的那样 51单片机的端口共有32个,去掉两个用于串口通信端口,可供使用的还有30个IO端口 你的发光二级管随意接在这30个端口的任意一个都可以 然后编写代码,再根据你连接的端口进行赋值 至于串口的接收内容存储...

  • 1535536790151单片机异步串行通信的帧结构由哪些部分组成。
    陈侍吴中央处理器、程序存储器、数据存储器。51子系列单片机由CPU、数据存储器RAM、程序存储器ROM、特殊功能寄存器、4个I\/O口、串行口、定时器\/计数器、中断系统等八个功能部件组成。

  • 1535536790151单片机的串口接收一帧数据有几位?
    陈侍吴发送的位数跟工作方式有关。51单片机的发送和接受,只有10位和11位两种。先说单片机串口的工作方式:单片机串口的工作方式共4种,方式0--方式3.方式0:用移位脉冲。RXD做输入\/输出,TXD进行移位。收发的数据为八位。方式1:传送一帧信息为10位,即1位起始位(0),8位数据位(低位在先)和1位停止...

  • 1535536790151单片机串口通讯(模式1)问题:发送内容前半部分出错,后半部分正确。错...
    陈侍吴ET1=1;此语句是罪魁祸首,定时器1已经作为串口波特率发生器了,就不能做其他用途了,此时定时必须禁止中断,而你程序中恰恰相反,来了句ET1=1;开启了定时器1中断,导致串口波特率发生混乱。那当然串口通信会有问题了,删掉ET1=1;该语句即可。

  • 1535536790151单片机串口通信,和I2C串口通信协议有什么区别和相同
    陈侍吴串口通信准确的说叫RS232通信,串口通信和I2C都是串行通信,但串口通信是RS232协议,I2C通信是遵循I2C协议,举个简单例子,从A到B有条路,一个人走路过去,一个人坐车过去。串行通信就是相当于路,RS232和I2C协议相当于走路和坐车两种不同的方式 赞同 ...

  • 1535536790151单片机串口通讯,如图 这边给SBUF赋值后,单片机是 1 马上发送SBUF的值...
    陈侍吴第二是正确的,边发送边执行以下程序,因为只要送数给SBUF后,就是硬件在管理了,不影响后续程序的执行。

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网