打印

请教51串口向外发数据的问题

[复制链接]
2238|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coltgg|  楼主 | 2011-10-24 18:54 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
大家好!
51通过串口向外发数据是不是只能发字符、字符串型的数据?
要把数值型的数据通过串口发书区要怎么做啊?
例如:
int a;
a=5000;
怎么把这5000通过串口发出去,谢谢!!

相关帖子

沙发
maychang| | 2011-10-24 19:17 | 只看该作者
单片机串口每次(一帧)只能处理一字节,至于这一字节是什么,由你自己决定。
例如你要发送十进制5000这个数字,可以用ASCII码发送"5"、"0"、"0"、"0",共四字节,也可以用BCD码发送,也是四字节。还可以将十进制5000转换成16进制发送,即发送int类型数据的高字节和低字节,或者用ASCII码发送16进制的四位数字"1"、"3"、"8"、"8"……

使用特权

评论回复
板凳
coltgg|  楼主 | 2011-10-24 19:30 | 只看该作者
那么发送转换为16进制的数后是不是这样发送:
SBUF =0x13;
SBUF=0x88;

使用特权

评论回复
地板
程序匠人| | 2011-10-24 19:44 | 只看该作者
那么发送转换为16进制的数后是不是这样发送:
SBUF =0x13;
SBUF=0x88;
coltgg 发表于 2011-10-24 19:30


恐怕不是这么简单。
送第一个字节到SBUF之后,要等缓冲区发送完毕后,再送第2个字节。

使用特权

评论回复
5
maychang| | 2011-10-24 20:56 | 只看该作者
比较好的方法是使用串口中断。

使用特权

评论回复
6
coltgg|  楼主 | 2011-10-25 09:21 | 只看该作者
5# maychang

谢谢! 就是不太懂如何把一个数值型的量转为字符串发送,因为51向外发送只能发字符型。
而且数值是通过中断在51里实时计算出来的...求解啊

使用特权

评论回复
7
HWM| | 2011-10-25 09:35 | 只看该作者
to 6L:

“因为51向外发送只能发字符型”

不是,也可按八位字节输出。注意第二个字节输出前查询一下上个字节是否发送完毕(TF)。如此,输出一般不必采用中断方式。

使用特权

评论回复
8
coltgg|  楼主 | 2011-10-25 20:31 | 只看该作者
7# HWM

谢谢,那么如果我的数值int a是实时在51里算出来的,要向外发送,应该怎么发送呢...

使用特权

评论回复
9
HWM| | 2011-10-25 20:51 | 只看该作者
to 8L:

一样是一个个字节发。送完SBUF后等待UART的发送完成标志,然后再发第二个字节。这是最快捷的发送方式,只是CPU少许化了点等待时间。若想利用这点时间的话,可以采用中断方式(UART发送完毕后中断CPU请求再发下一个字节),不过这有点复杂,就发送效率来说没任何提高(需要中断机制的参与)。

使用特权

评论回复
10
coltgg|  楼主 | 2011-10-25 21:11 | 只看该作者
9# HWM
再次谢谢!!有点懂了,假设现在算出a=1234,一个一个字节发要怎么把它拆开呢?
假设:一个字节可以是一个16进制数,是不是要先把它转换为16进制数,把1234转换为0x4D2,然后先发4,再发D,再发2?
这有两个问题,1,怎么把一个int转换为一个一个的16进制数?2,把这3个16进制数发到电脑上后,电脑能显示出十进制数1234吗?
谢谢:)

使用特权

评论回复
11
HWM| | 2011-10-25 21:20 | 只看该作者
to 10L:

计算机里面是二进制存储,这里的int类型整数是个16位二进制的数(即两个八位的字节构成)。只要将int分拆成两个字节便可(这个操作非常方便),然后再分别将这两个字节通过UART送出去。

使用特权

评论回复
12
HWM| | 2011-10-25 21:25 | 只看该作者
如 1234,十六制是4D2。分拆成两个字节就是:高字节 04,低字节 D2。

使用特权

评论回复
13
coltgg|  楼主 | 2011-10-25 21:26 | 只看该作者
11# HWM
多谢了,我试试:)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:好好学习天天向上

0

主题

23

帖子

1

粉丝