单片机串口接收数据就会中断一次吗

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;
}

}
展开
 我来答
意法半导体(中国)投资有限公司 2023-06-12
展开全部
意法半导体致力于引领单片机技术和产品的创新,推动生态系统的建设,为用户提供满意的产品和技术服务。意法半导体单片机产品线拥有业界宽广、极具创新力的32位产品系列 – STM32,覆盖超低功耗、超高性能方向,同时兼具一流的市场竞争力。STM32是ARM Cortex内核单片机和微处理器市场和技术方面的佼佼者,目前提供16大产品线 (F0, G0, F1, F2, F3, G4, F4, F7, H7, MP1, L0, L1, L4, L4+,L5, WB),超过1000个型号。STM32产品广泛应用于工业控制、消费电子、物联网、通讯设备、医疗服务、安防监控等应用领域,其优异的性能进一步推动了生活和产业智能…
笃学博志
推荐于2017-09-12 · TA获得超过1222个赞
知道小有建树答主
回答量:248
采纳率:0%
帮助的人:247万
展开全部
嗯,是的,串口接一次数据,如果中断开的话就中断一次!
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 广告
单片机是一种集成处理器,通常包含微控制器、存储器、通信接口和其他外设。它们通常用于嵌入式系统,如智能家居设备、汽车电子系统、工业自动化和消费电子产品等。单片机可以通过编程来实现各种功能,如数据处理、输入输出控制、通信等。由于单片机体积小、功... 点击进入详情页
本回答由意法半导体(中国)投资有限公司提供
七彩镜
2015-01-06 · TA获得超过1127个赞
知道小有建树答主
回答量:273
采纳率:0%
帮助的人:210万
展开全部
你可以如下修改程序来达到目的。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 满足条件了再执行相应的程序也是一样的。
追问
for(iif0=0;iif0<sizeof(iy0);iif0++)	   //1
{
SBUF=iy4[jj9++];
while(!TI);
TI=0;
}这样可以吗
追答
iy4和iy0似乎对不上,其它似乎没什么问题,但没有完整程序不好说。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
长大就还俗
2015-01-06 · TA获得超过3441个赞
知道小有建树答主
回答量:1238
采纳率:16%
帮助的人:778万
展开全部
接收:
要接收完全部数据,首先要约定你这次总共发了多少个数据
你可以在中断里,连续接收多个字节
比如你连接接收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;
}
}
}
如果满意,请采纳!
展开全部
接收完一个byte后才中断,不是一个bit。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
查晓筠0i5
2015-01-06 · TA获得超过2752个赞
知道大有可为答主
回答量:2.1万
采纳率:1%
帮助的人:4963万
展开全部
开了中断就会的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式