void main()
{
while (1)
{这里放判断程序}
}
void Uart() interrupt 4 using 1//要是中断一次来接收一字节是不是又回到 void main()运行?,有什么方法不让他返回 void main()吗?让他完整接收完所有数据在返回!
{
if (RI)
{
RI = 0;
str[i++]=SBUF;
RI = 0;
}
}
跳出中断可以调到我设置的void ggg()里吗?我在中断里写个判断,要是数据不大于几跳到void ggg()空循环,等待数据接收
追答不可以的,你在串口中断里面写空循环的话,就一直在循环,主要是串口中断一旦发生,语句还在串口中断里面,即使再有数据发过来,也再进不了中断,因为同级中断不能打断同级中断!
追问还有就是发送数据串口延时过快会有些数据没有发送或者发送的直接是乱码
追答不懂你说的延时过快什么的,一般不需要延时函数放在发和收的函数里面,至于说乱码的问题是可能你的看串口的软件设置问题吧,比如串口助手,如果比发字符,接收软件显示是字符就是正确,十进制就是乱码
如果满意,请采纳!
iy0里是123456789
我用FOR循环向电脑发数据,我设置延时,不设置发不了,设置1us收到会乱码或者就几个字节乱码,设置1mS可以正常接收到数据,不过发送太慢
如
for(iif0=0;iif0<sizeof(iy0);iif0++)
{
SBUF=iy0[jj0++];
Delay10ms();
}
串口9600
程序里也是9600
不关这里的事
发送的快慢是根据波特率的快慢决定的,波特率的大小是根据定时器1设置的。至于说你要用延时来找那个区间是不可取的代码。要准确接收必须查询加上中断来确定:
给你个参考程序:
void main()
{
TMOD=0x20;//设置定时器1为工作方式2
TH1=0xfd;
TL1=0xfd;
TR1=1;
REN=1;
SM0=0;
SM1=1;
EA=1;
ES=1;
while(1)
{
if(flag==1)
{
ES=0; //关闭串口中断寄存器,防再次中断
flag=0;
SBUF='1';//28; //填发送的数据
while(!TI); //此句就是你的关键,查询TI寄存器是否为1,为1就是发送成功
TI=0; //手动清0,以用于下次发送数据
SBUF='2';//28; //同上面
while(!TI);
TI=0;
SBUF='3';//28;
while(!TI);
TI=0;
ES=1; //连发3个后打开串口中断,准备接收
}
}
}
void ser() interrupt 4
{
RI=0;
a=SBUF;
flag=1;
}
SBUF=iy4[jj9++];
while(!TI); //我在这里加上用这个来等待是否发出去了是吗?
TI=0; //发出去了清0接着发是吗?还需要FOR循环直循环发送完吗?
每循环一次进行一次
每循环一次进行一次
追问用这个while(!TI);接收数据过快会导致复位
追答我现在想问你的是:你要实现的功能是只接还是只发还是既接又发了??
你把你的程序功能说一遍然后给我把你的源码发过来,我帮你改吧,交流了半天还没弄清楚,看你贴出的程序是收了,但是写的又是发了!发往邮箱294093062@qq.com
for(iif0=0;iif0<sizeof(iy0);iif0++) //1
{
SBUF=iy4[jj9++];
while(!TI);
TI=0;
}这样可以吗
iy4和iy0似乎对不上,其它似乎没什么问题,但没有完整程序不好说。
SBUF=iy4[jj9++];
while(!TI); //用这个来等待是否发出去了是吗?
TI=0; //发出去了清0接着发是吗?还需要FOR循环直循环发送完吗?
发送数据时,TI是1
等TI变成0
表示数据发出去了
可以装载下一个字节了
TI需要你在软件里清0,就是TI=0这句
你可以用for循环把所有字节都发完
和3.3V串口连接单片机会无限循环,用这个语句就会,不用就不会!
放在主程序里,我设置里条件才开始但是无限循环,电脑连接又不会,又正常
while(!TI);
TI=0;
TI是发送中断标志
如果你不发送数据,
它一直是0,
那while(!TI)这个条件就一直满足,
所以就死循环了
你要在while前发送一个数据才行
数据发完了,TI变成1了,循环就结束了
while(!TI)其实是在查询单片机把数据发出去了没有
怎么说?我好像就是这样做的,你写个用FOR循环数组发数据代码我看看!主要是简单最好
追答循环接收iBagSize个字节放到数组sBagData里
for(iX=0;iX<iBagSize;iX++)
{
while(RI==0);
sBagData[iX]=SBUF;
RI=0; //清中断标志
}
循环发送iBagSize个字节
for(iX=0;iX<iBagSize;iX++)
{
SBUF=sBagData[iX];
while(TI==0);
TI=0;//清除中断标志
}
注意:如果你的循环发送语句不是在串行中断里,那你要禁止串行中断允许,因为每发送一个字节都会产生一次串行中断。
你追问这么多,说明你挺好学的
不过,别人说的只拿来参考,你有时间自己多试试,失败才得到经验
回答你问题的人很多都很努力
如果你要选最佳,无法衡量时,建议选择最快回答的笃学博志
他好像需要最佳答案获取升级经验
我不专注于这方面,我专注于游戏~~~
单片机串口接收数据就会中断一次吗
嗯,是的,串口接一次数据,如果中断开的话就中断一次!1、接受数据的中断一次只能接1个bit,直到循环接完,再把接到的数据8个bit组装为1个完整的byte,就这样,不可能全部接完再跳出中断。2、如果你怕影响执行主函数main()中的语言,请在主函数中设置标志判断变量使得全部接受完成再进行执行。3、连...
单片机串口接收数据就会中断一次吗
串口接收数据时,有两种方式。一种是中断方式,需要开中断,设置允许中断标志位。这样,每接收一个字节,就中断一次。另一种就是查询方式,不允许中断,每接收一个数据都要查询一下RI标志位,当RI=1,就接收到了一个数据。
我给单片机用串口发送“A”“B”“C”三个数据,但是我想单独提取其中一...
串口向单片机发送数据,不论发送多少个,单片机也是一个一个接收的,如果单片机的串口设置成中断方式,则每接收一个数据都会中断一次,这样,在中断程序中按顺序接收并保存在一个数组中,要先定义一个数组。假如,串口发送3个数据,那定义数组就3个元素。当接收完3个数据后,再从数组中逐个判断所要的字符...
单片机串行口收发结束后为什么要中断
出现中断,是便于你及时进行数据处理。收到后的中断函数中,应该把SBUF的数据读出,并送到其它的位置,腾出SBUF,便于接收下一个数据。在发送完的中断函数中,应该发送下一字节。(如果没有了,当然就不发了。)
51单片机串口接收多个字符(假如是4字节),是分4次中断传输的,还是一次中 ...
对于51而言,每帧产生一次中断。接收4个字节是分4次中断接收完成的。51的UART模块从串行移位寄存器接收完成后是直接放入接收缓冲的,而且接收缓冲只有一个单元。
单片机里串行中断服务函数作用是什么呢?
你的中断服务函数作用是:串口设备每接收一个字节数据(8位)便产生一次中断,并检测是否收到的是字符【,不是则放弃数据,是则保存到数组 jsbuf 里去,然后把随后接收到的字节数据也一一保存到这个数组去,直到接收到字符 】为止,同样保存,并设置标记 rflag;一句话,就是要从接收的数据中,提取 ...
怎么用单片机确定串口接收数据的时间间隔?
后12位用于存放整数部分。将波特率算出来后,数值填入这个波特率就可以了。必须用中断的方式接收,每接收一个字节中断一次,然后统计接收字节数,达到要求的数量后再进行处理。对于不等长的数据帧,可根据第一个字节(这种通信方式都有一个字节的特征字)或特征字来区分,然后确定接收的字节数。
51单片机串口发送数据时会产生中断吗
如果开了串口中断,接收,发送都会产生中断。建议,都用中断方式。串口接收到数据后,如果没有读出来,又接收到数据了,前面的一个数据就丢掉了。特别是当你接收到字符串的时候,你关中断,或者用查询方式,就容易掉数据。
单片机在什么情况下可以引起串口中断?
开串口中断了,有数据发送或允许接收而有数据接收时,就会引起串口中断
单片机串口为什么接收数据开中断
串口接收寄存器SBUF收到数据后会把接收标志位RI置位的,电脑发送数据是一个字节接着一个字节,两个字节之间会有延时,所以收到数据你需要尽快处理,不然可能会被新的数据覆盖,配置中断就是为了及时响应把数据读出存储起来。所以SBUF内收到数据后RI就会置1,在中断里把数据存储 然后及时把RI清零接收下一...