这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 综合技术 » 通讯及无线技术 » 关于串口通信的问题

共4条 1/1 1 跳转至

关于串口通信的问题

菜鸟
2007-11-15 15:17:22     打赏
#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进制显示呢?????



关键词: 关于     串口     通信     问题    

工程师
2007-11-15 15:21:15     打赏
2楼
while(!TI);//这句话的作用      
        TI=0;

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

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

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

准备下一次通信...
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????      

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

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

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

菜鸟
2007-11-15 15:23:56     打赏
3楼
这样啊,可是还是有些不明白,如果没有while(!TI);这句话的话,为什么一直不断的会往上位机发sbuf的数据呢。。。我明明只写了一句subf=num,这点很不明白?

工程师
2007-11-15 15:26:34     打赏
4楼
第一个问题:
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。

共4条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]