首页
新闻
论坛
群组
Blog
文档
下载
读书
Tag
网摘
搜索
.NET
Java
游戏
视频
人才
外包
培训
数据库
书店
程序员
欢迎您:
游客
| 退出
| 登录
注册
帮助
我的帖子
我参与的帖子
我的空间
我的网摘
CSDN
CSDN社区
硬件/嵌入开发
单片机/工控
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
生成帖子
置顶
推荐(加精)
取消推荐(加精)
锁定帖子
移动帖子
取消引用
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
初学者关于串口通信的问题
加为好友
发送私信
在线聊天
m65705048
猛人
等级:
发表于:
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
回复次数:
6
显示所有回复
显示星级回复
显示楼主回复
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lbing7
先走稳再说吧...
等级:
发表于:
2007-11-14 17:11:20
1
楼 得分:
0
while(!TI);//这句话的作用
TI=0;
呵呵,这个是查询方式待等串口发送结束....
串口发送结束后会硬件自动置TI为1
等TI为1后,清除TI....
准备下一次通信...
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lbing7
先走稳再说吧...
等级:
发表于:
2007-11-14 17:14:46
2
楼 得分:
0
2.我用的串口调试助手v2.1,如果要发回上位机的话,如何以10进制而不是16进制显示呢?????
串口以及串口通信助手仅仅是基本的通信功能
要实现显示10进制,那必须得进行转换工作
你可以在上位机实现,如重写一个串口工具,收到数据后转为十进制再显示
你也可以在单片机上进行,先把数据转成十进制的串,然后再通过串口把串发到串口助手,让它以文本方式来显示你的内容就可以了
后一种方法,你可以看一下sprintf()这个函数,呵呵,算是一个提示吧...
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
m65705048
猛人
等级:
发表于:
2007-11-14 17:29:51
3
楼 得分:
0
如果没有while(!TI);这句话的话,为什么一直不断的会往上位机发sbuf的数据呢。。。我明明只写了一句subf=num,这点很不明白
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
lhddomain
东东
等级:
发表于:
2007-11-15 11:06:25
4
楼 得分:
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。书中自有黄金屋。
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
knowledge_Is_Life
阿凡
等级:
发表于:
2008-05-01 19:03:04
5
楼 得分:
0
该回复于2008-05-04 09:35:11被版主删除
修改
删除
举报
引用
回复
加为好友
发送私信
在线聊天
clw_zxq
寒芦飘絮
等级:
发表于:
2008-05-01 19:14:49
6
楼 得分:
0
这句话是说,程序执行到此之后,如果没有发送信息,则在此一直等待,直到成功地发送了信息,
发送信息之后,硬件会自动设置TI=1,则while(!TI)其中!TI=0,所以此时while(!TI)就不会
在继续执行了,转而执行下一句TI=0,也就是清除发送中断,以便可以继续使用。
修改
删除
举报
引用
回复
将帖子提前
放进我的网摘
推荐给好友
我要提问
帖子加分
结贴去...
管理菜单
页面风格切换
标准风格
老版本论坛
网站简介
-
广告服务
-
网站地图
-
帮助
-
联系方式
-
诚聘英才
-
English
-
问题报告
北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
abc推荐给好友