首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 初学者关于串口通信的问题
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-14 17:06:25 楼主
    #include <reg52.h>
    #define uc unsigned char
    #define ui unsigned int

    uc snum,flag;
    ui num;

    void main()
    {
        TMOD=0x20;
        TH1=0xf4;
        TL1=0xf4;
        TR1=1;
        SM0=0;
        SM1=1;
        REN=1;
        EA=1;
        ES=1;
        while(1)
        {
            if(flag==1)
            {
                ES=0;
                flag=0;
                SBUF=num;
                while(!TI);//这句话的作用
                  TI=0;
                SBUF=snum;
                while(!TI);
                TI=0;
                if(num <256)
                {
                    num++;
                }
                else
                {
                    num=0;
                }
                ES=1;
            }
        }
    }

    void serial() interrupt 4
    {
        snum=SBUF;
        flag=1;
        RI=0;
    }

    说明一下,变量num是每次发送的序列号,到255自动归0,有两个问题
    1.已经注释,就是while(!TI)这句话的作用。。。
    2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
    20  修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbing7
    • 等级:
    发表于:2007-11-14 17:11:201楼 得分:0
    while(!TI);//这句话的作用 
        TI=0;

    呵呵,这个是查询方式待等串口发送结束....

    串口发送结束后会硬件自动置TI为1

    等TI为1后,清除TI....

    准备下一次通信...
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • lbing7
    • 等级:
    发表于:2007-11-14 17:14:462楼 得分:0
    2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢????? 

    串口以及串口通信助手仅仅是基本的通信功能

    要实现显示10进制,那必须得进行转换工作
    你可以在上位机实现,如重写一个串口工具,收到数据后转为十进制再显示
    你也可以在单片机上进行,先把数据转成十进制的串,然后再通过串口把串发到串口助手,让它以文本方式来显示你的内容就可以了

    后一种方法,你可以看一下sprintf()这个函数,呵呵,算是一个提示吧...


    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-14 17:29:513楼 得分:0
    如果没有while(!TI);这句话的话,为什么一直不断的会往上位机发sbuf的数据呢。。。我明明只写了一句subf=num,这点很不明白
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2007-11-15 11:06:254楼 得分:0
    第一个问题:
    while(!TI);//这句话的作用 -->TI是发送成功的标志位,当SBUF中的数据发送完毕时
    由硬件自动将TI置1,但要手动清零(准备下一次发送),所以后面要跟TI=0;其作用是:等待SBUF中的数据发送完毕。
    没发送完-->TI==0;//while(!0) == while(1) --> ;是空语句,条件为真(1)循环执行空语句进行等待。
    发送完毕-->TI==1;//while(!1) == while(0) --> ;是空语句,条件为假(0)跳过空语句执行下一条指令。

    第二个问题:
    2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢????? 

    大哥, 串口调试助手v2.1 里面有设置 ASCII/十六进制 显示 -->33(ASCII的3)% 10 =3(十进制的3)

    如果你要发送16进制 那么 SBUF=0x0A; 发送16进制的10 。 SBUF=3;发送出来是33,即ASCII码。

    第三个问题:
    请注意 flag 的设置, 还有你的中断接收有问题。请看看书-->SBUF中的 TI/RI 在何时、为什么变0、变1。书中自有黄金屋。
             
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-01 19:03:045楼 得分:0
    该回复于2008-05-04 09:35:11被版主删除
    修改 删除 举报 引用 回复
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    发表于:2008-05-01 19:14:496楼 得分:0
    这句话是说,程序执行到此之后,如果没有发送信息,则在此一直等待,直到成功地发送了信息,
    发送信息之后,硬件会自动设置TI=1,则while(!TI)其中!TI=0,所以此时while(!TI)就不会
    在继续执行了,转而执行下一句TI=0,也就是清除发送中断,以便可以继续使用。
    修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved