单片机串口接收数据就会中断一次吗
voidmain(){while(1){这里放判断程序}}voidUart()interrupt4using1//要是中断一次来接收一字节是不是又回到voidmain()...
void main()
{
while (1)
{这里放判断程序}
}
void Uart() interrupt 4 using 1//要是中断一次来接收一字节是不是又回到 void main()运行?,有什么方法不让他返回 void main()吗?让他完整接收完所有数据在返回!
{
if (RI)
{
RI = 0;
str[i++]=SBUF;
RI = 0;
}
} 展开
{
while (1)
{这里放判断程序}
}
void Uart() interrupt 4 using 1//要是中断一次来接收一字节是不是又回到 void main()运行?,有什么方法不让他返回 void main()吗?让他完整接收完所有数据在返回!
{
if (RI)
{
RI = 0;
str[i++]=SBUF;
RI = 0;
}
} 展开
5个回答
意法半导体(中国)投资有限公司
2023-06-12
展开全部
展开全部
嗯,是的,串口接一次数据,如果中断开的话就中断一次!
1、接受数据的中断一次只能接1个bit,直到循环接完,再把接到的数据8个bit组装为1个完整的byte,就这样,不可能全部接完再跳出中断。
2、如果你怕影响执行主函数main()中的语言,请在主函数中设置标志判断变量使得全部接受完成再进行执行。
3、连续接的写法是:
#include<reg52.h>
bit flag=0; //判断的全局变量
void main()
{
while (1)
{
if(flag==1)
{ }
}
}
void Uart() interrupt 4 using 1
{
unsigned int i=0;
if (RI)
{
RI = 0;
for(i=0;i<8;i++)
str[i]=SBUF; //定义str[i]为8位的数组
if(i==8)
{
flag = 1;
}
}
}
如果满意,请采纳!
1、接受数据的中断一次只能接1个bit,直到循环接完,再把接到的数据8个bit组装为1个完整的byte,就这样,不可能全部接完再跳出中断。
2、如果你怕影响执行主函数main()中的语言,请在主函数中设置标志判断变量使得全部接受完成再进行执行。
3、连续接的写法是:
#include<reg52.h>
bit flag=0; //判断的全局变量
void main()
{
while (1)
{
if(flag==1)
{ }
}
}
void Uart() interrupt 4 using 1
{
unsigned int i=0;
if (RI)
{
RI = 0;
for(i=0;i<8;i++)
str[i]=SBUF; //定义str[i]为8位的数组
if(i==8)
{
flag = 1;
}
}
}
如果满意,请采纳!
更多追问追答
追问
跳出中断可以调到我设置的void ggg()里吗?我在中断里写个判断,要是数据不大于几跳到void ggg()空循环,等待数据接收
追答
不可以的,你在串口中断里面写空循环的话,就一直在循环,主要是串口中断一旦发生,语句还在串口中断里面,即使再有数据发过来,也再进不了中断,因为同级中断不能打断同级中断!
意法半导体(中国)投资有限公司
2023-08-25 广告
2023-08-25 广告
单片机是一种集成处理器,通常包含微控制器、存储器、通信接口和其他外设。它们通常用于嵌入式系统,如智能家居设备、汽车电子系统、工业自动化和消费电子产品等。单片机可以通过编程来实现各种功能,如数据处理、输入输出控制、通信等。由于单片机体积小、功...
点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
展开全部
你可以如下修改程序来达到目的。xx是你要接收多少个字节后结束的判断条件,需要在中断程序外事先赋值(如 j = xx;)。当然你也可以改变结束判断条件(比如隔多久没再收到数据就表示结束)。
void Uart() interrupt 4 using 1//要是中断一次来接收一字节是不是又回到 void main()运行?,
//有什么方法不让他返回 void main()吗?让他完整接收完所有数据在返回!
{
while (j <= xx)
{
if (RI)
{
RI = 0;
str[i++]=SBUF;
RI = 0;
}
j++;
}
}
不认同楼上的说法,串口是个独立的功能部件,是按字节接收的,也就是接收完一整个字节才会产生一次中断,而不是接收1个位(bit)就中断。你的程序进入中断后,虽然串口无法再再次进入中断,但仍然会产生RI。就是因为串口是独立工作的,它的收发并不受程序影响。而是否进能进中断是受程序设定的条件和状态控制的。
但个人也不赞成程序在中断中耽误太多时间(比如上述中断中加入循环,等待接收完成再退出的做法也是不妥的)。中断中呆的时间过长,就会导致同级及低级别中断长时间得不到响应(假如你的T1设定优先级与串口一样,而它产生中断得不到响应,就会造成定时不准)。
所以上述程序还是应该将while循环放到主程序中,等 j 满足条件了再执行相应的程序也是一样的。
void Uart() interrupt 4 using 1//要是中断一次来接收一字节是不是又回到 void main()运行?,
//有什么方法不让他返回 void main()吗?让他完整接收完所有数据在返回!
{
while (j <= xx)
{
if (RI)
{
RI = 0;
str[i++]=SBUF;
RI = 0;
}
j++;
}
}
不认同楼上的说法,串口是个独立的功能部件,是按字节接收的,也就是接收完一整个字节才会产生一次中断,而不是接收1个位(bit)就中断。你的程序进入中断后,虽然串口无法再再次进入中断,但仍然会产生RI。就是因为串口是独立工作的,它的收发并不受程序影响。而是否进能进中断是受程序设定的条件和状态控制的。
但个人也不赞成程序在中断中耽误太多时间(比如上述中断中加入循环,等待接收完成再退出的做法也是不妥的)。中断中呆的时间过长,就会导致同级及低级别中断长时间得不到响应(假如你的T1设定优先级与串口一样,而它产生中断得不到响应,就会造成定时不准)。
所以上述程序还是应该将while循环放到主程序中,等 j 满足条件了再执行相应的程序也是一样的。
追问
for(iif0=0;iif0<sizeof(iy0);iif0++) //1
{
SBUF=iy4[jj9++];
while(!TI);
TI=0;
}这样可以吗
追答
iy4和iy0似乎对不上,其它似乎没什么问题,但没有完整程序不好说。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
接收:
要接收完全部数据,首先要约定你这次总共发了多少个数据
你可以在中断里,连续接收多个字节
比如你连接接收4个字节,那你发送时发完4个字节,才退出中断
若不到4个,程序会在中断里等待,不返回主程序
发送:
for(iif0=0;iif0<sizeof(iy0);iif0++)
{
SBUF=iy0[jj0++];
Delay10ms();
}
不应该用延时程序,而是查询TI标志
要接收完全部数据,首先要约定你这次总共发了多少个数据
你可以在中断里,连续接收多个字节
比如你连接接收4个字节,那你发送时发完4个字节,才退出中断
若不到4个,程序会在中断里等待,不返回主程序
发送:
for(iif0=0;iif0<sizeof(iy0);iif0++)
{
SBUF=iy0[jj0++];
Delay10ms();
}
不应该用延时程序,而是查询TI标志
更多追问追答
追问
SBUF=iy4[jj9++];
while(!TI); //用这个来等待是否发出去了是吗?
TI=0; //发出去了清0接着发是吗?还需要FOR循环直循环发送完吗?
追答
发送数据时,TI是1
等TI变成0
表示数据发出去了
可以装载下一个字节了
TI需要你在软件里清0,就是TI=0这句
你可以用for循环把所有字节都发完
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2017-09-19
引用笃学博志的回答:
嗯,是的,串口接一次数据,如果中断开的话就中断一次!
1、接受数据的中断一次只能接1个bit,直到循环接完,再把接到的数据8个bit组装为1个完整的byte,就这样,不可能全部接完再跳出中断。
2、如果你怕影响执行主函数main()中的语言,请在主函数中设置标志判断变量使得全部接受完成再进行执行。
3、连续接的写法是:
#include<reg52.h>
bit flag=0; //判断的全局变量
void main()
{
while (1)
{
if(flag==1)
{ }
}
}
void Uart() interrupt 4 using 1
{
unsigned int i=0;
if (RI)
{
RI = 0;
for(i=0;i<8;i++)
str[i]=SBUF; //定义str[i]为8位的数组
if(i==8)
{
flag = 1;
}
}
}
如果满意,请采纳!
嗯,是的,串口接一次数据,如果中断开的话就中断一次!
1、接受数据的中断一次只能接1个bit,直到循环接完,再把接到的数据8个bit组装为1个完整的byte,就这样,不可能全部接完再跳出中断。
2、如果你怕影响执行主函数main()中的语言,请在主函数中设置标志判断变量使得全部接受完成再进行执行。
3、连续接的写法是:
#include<reg52.h>
bit flag=0; //判断的全局变量
void main()
{
while (1)
{
if(flag==1)
{ }
}
}
void Uart() interrupt 4 using 1
{
unsigned int i=0;
if (RI)
{
RI = 0;
for(i=0;i<8;i++)
str[i]=SBUF; //定义str[i]为8位的数组
if(i==8)
{
flag = 1;
}
}
}
如果满意,请采纳!
展开全部
接收完一个byte后才中断,不是一个bit。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
开了中断就会的
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询