找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2610|回复: 10
打印 上一主题 下一主题
收起左侧

哪位大神能给解释解释for(i=0;s[i]!='#'&&i<50;i++) 是什么意思

[复制链接]
跳转到指定楼层
楼主
ID:168971 发表于 2020-11-5 21:50 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
for(i=0;s[i]!='#'&&i<50;i++)  //就是这句,难倒我了,快帮我解释一下
{  
        SBUF=s[i];  
        while(!TI);  
        TI=0;  
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:168971 发表于 2020-11-5 21:51 | 只看该作者
源程序是这样的,是51黑的一位大神的作品
#include <reg52.h>  //这个文件还是没看明白,以后再研究吧,会用就行了
#include <stdio.h>              //printf头文件  
#define uc unsigned char   
#define uint unsigned int  

uc flag;
uc i;
uc flag_t;
uc s[50]="";
uc j=0;
uc flag_n=0;  
uc code table[]="显示的字符是I get 1";         

void init()  
{  
        TMOD=0x20;    //定时器工作方式,选择了定时器1,工作方式2 八位初值自动重装的8位定时器。         
        TH1=0xfd;     //定时器1初值  ,设置波特率为9600 晶振11.0529MHZ?  
        TL1=0xfd;  
        TR1=1;        //开启定时器1  

        SM0=0;  
        SM1=1;        //10位异步接收,(8位数据)波特率可变  
        REN=1;        //允许串行口接收位  
        EA=1;         //允许中断(总闸)  
        ES=1;         //允许串口中断  
}  
void main()  
{  
        init();  
        while(1)  
        {  
                if(flag==1)  
                {     
                        if(flag_n!=0)        //使第二个及以后I get xx 换行,不与You transfer在一行(单纯为了格式好看)  
                        {
                                TI=1;  
                                printf("\n");  
                                while(!TI);  
                                TI=0;  
                        }  
                        for(i=0;i<20;i++)  
                        {  
                                SBUF=table[i];  
                                while(!TI);  
                                TI=0;  
                        }  
                        for(i=0;s[i]!='#'&&i<50;i++)  
                        {  
                                SBUF=s[i];  
                                while(!TI);  
                                TI=0;  
                        }  
                        flag=0;  
                }  
                if(flag_t==1)                          //发送完毕之后,在电脑端输出。  
                {  
                        TI=1;                              //printf之前必须将T1置为1才行。  
                        printf ("\nYou transfer %s",s);  
                        while(!TI);  
                        TI=0;  
                        flag_t=0;  
                }     
        }  
}  

void ser() interrupt 4  
{  
        if(RI)       //接收到了数据,RI为1
        {         
                RI=0;                //接收数据之后,手动将RI清0  

                if(flag==0&&j!=0)                //1.循环赋值为'\0'(字符串结尾标志符)
                {                                                //2.flag为0和j不为0时,保证是第二次及以后,传输字符串(控制输出格式)  
                        flag_n++;              
                        for(j=0;s[j]!='#'&&j<50;j++)
                        {
                                s[j]='\0';
                        }
                        j=0;                                  //j=0,为了第二次传递字符串是又是从头输出
                }  
                s[j]=SBUF;
                flag=1;
               
                if(s[j]=='#'||j==49)        //以'#'作为传送字符串的结尾符,我定义的字符数组最长为50所以49也应该结束。  
                {
                        flag_t=1;  
                }
                else  
                {       
                        j++;
                }               
        }  
//        if(TI)     //这个是我自己屏蔽的,作者并没有屏蔽//发送数据  
//        {
//                ;       
//        }      
}  
回复

使用道具 举报

板凳
ID:606226 发表于 2020-11-6 07:42 来自手机 | 只看该作者
就是S[i]字符串进行传输,当字符串中以#号结束就停止传输,最多传49个字符
回复

使用道具 举报

地板
ID:213173 发表于 2020-11-6 08:12 | 只看该作者
在数组s[0]到s[49]范围查找'#'(ASCII字符码0x23),找到即结束循环,超过下标49没有找到也结束循环

        for(i=0; (s[i]!='#'&&i<50); i++)  
        {  
                SBUF=s[i];  
                while(!TI);  
                TI=0;  
        }         
回复

使用道具 举报

5#
ID:833190 发表于 2020-11-6 08:33 | 只看该作者
TI为1,表示数据发过来了,开始接受数据,一次中断最多接受50个字符,如果遇到‘#’或者超出50个,则结束,TI置0,while(!TI)表示用来等待下一次中断。当TI又为1时,跳出while这个循环,等待结束,开始又一次接收数据。
回复

使用道具 举报

6#
ID:420836 发表于 2020-11-6 09:23 | 只看该作者
楼上的解释很好。
回复

使用道具 举报

7#
ID:514901 发表于 2020-11-6 12:04 | 只看该作者
for(i=0;s[i]!='#'&&i<50;i++)  //就是这句,难倒我了,快帮我解释一下
{  
        SBUF=s[i];  
        while(!TI);   
        TI=0;  
}
明显可以知道这代码逻辑是 依次发送S[]数组的前50个元素,当发送过程中遇到S[]为‘#’时停止发送
回复

使用道具 举报

8#
ID:592183 发表于 2020-11-6 15:06 | 只看该作者
这个for循环的意思是通过串口依次发送数组(或字符串)s的内容,最多发送50个字符,如果发送中遇到字符'#'会立即结束发送。
回复

使用道具 举报

9#
ID:168971 发表于 2020-11-7 15:32 | 只看该作者
感谢大神们的指点~~~感谢知识共享
回复

使用道具 举报

10#
ID:1027319 发表于 2022-5-17 15:51 | 只看该作者
向日葵男人 发表于 2020-11-5 21:51
源程序是这样的,是51黑的一位大神的作品
#include   //这个文件还是没看明白,以后再研究吧,会用就行了
...

printf ("\nYou transfer %s",s)
你好 我想问一下这句话在程序中是什么意思吗
回复

使用道具 举报

11#
ID:1027483 发表于 2022-5-18 09:22 | 只看该作者
DaYzz1114 发表于 2022-5-17 15:51
printf ("\nYou transfer %s",s)
你好 我想问一下这句话在程序中是什么意思吗

输出转换的ASICII码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表