找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机串口收发数据进制转换问题

  [复制链接]
跳转到指定楼层
楼主
大家好,摸索很久还是没弄清楚,请教大家问题,请给予指点。谢谢大家

51单片机双机通信,

问题一:我想发送250这个十进制数,接收端接收的是否是经过转换的16进制数,如果我要在接收端存储或者比较这个数大小,是否要用额外的函数把接收的16进制数转成10进制数。

问题二:我发送的一个10进制数,接收端能否直接接收这个10进制数;
比如下面的语句是否可以正常执行。
发送端
set1=250;
SBUF=set1;

接收端
dat=SBUF;
if(dat<250){
......
}else
{
.....
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-5-8 15:00 | 只看该作者
发的啥收的就是啥,无论多少进制,在传输中都一样,是否转换只是你要显示的时候才有需要。比如你要在数码管上显示就要转换BCD码送给显示芯片或者要再查询出对应的段码信息送给比如595或者164这样的。或者直接送到某个端口。
回复

使用道具 举报

板凳
ID:192020 发表于 2024-5-8 15:17 | 只看该作者
传输没有进制说法,250换成16进制是0xFA,那么以下发送函数
(1)set1=250;SBUF=set1;(2)set1=0xFA;SBUF=set1;单片机处理过程都是一样的。
回复

使用道具 举报

地板
ID:705846 发表于 2024-5-8 15:34 | 只看该作者
qq475878026 发表于 2024-5-8 15:17
传输没有进制说法,250换成16进制是0xFA,那么以下发送函数
(1)set1=250;SBUF=set1;(2)set1=0xFA;SBUF= ...

你好,谢谢你的答复,进一步请教,
比如发送端发送的是250,接收端接收的是0xFA, 接收端要把接收到的0xFA显示到数码管为250,这之间是怎么转换的。
回复

使用道具 举报

5#
ID:161164 发表于 2024-5-8 15:48 | 只看该作者
samxon 发表于 2024-5-8 15:34
你好,谢谢你的答复,进一步请教,
比如发送端发送的是250,接收端接收的是0xFA, 接收端要把接收到的0xF ...

按位取值

RecBuff = SBUF;
DispBuff[0] = RecBuff /100%10;
DispBuff[1] = RecBuff /10%10;
DispBuff[2] = RecBuff %10;
回复

使用道具 举报

6#
ID:705846 发表于 2024-5-8 16:02 | 只看该作者
lkc8210 发表于 2024-5-8 15:48
按位取值

RecBuff = SBUF;

谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要把0xFA在数码管上显示250, 是否需要转换,如果需要,是如何转换的。
回复

使用道具 举报

7#
ID:192020 发表于 2024-5-8 16:07 | 只看该作者
samxon 发表于 2024-5-8 15:34
你好,谢谢你的答复,进一步请教,
比如发送端发送的是250,接收端接收的是0xFA, 接收端要把接收到的0xF ...

就是按五楼的方法,你不用纠结接收端收到的是0xFA还是250,因为接收端接收的就是一堆0和1。数码管需要显示十进制,那就把set1看成十进制,然后按五楼方法把百位十位个位分开来一个个显示。
回复

使用道具 举报

8#
ID:106977 发表于 2024-5-8 16:26 | 只看该作者
串口通讯实际也是需要协议的,自己规定的协议。不然你发送几个字节,另一台接收设备怎么解读这几个字节?
回复

使用道具 举报

9#
ID:192020 发表于 2024-5-8 16:31 | 只看该作者
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

就比如set1这个变量,你可以说它是0xFA,也可以说它是250都没错,但它只是存在RAM里的一个数据,按11111010排列罢了
回复

使用道具 举报

10#
ID:705846 发表于 2024-5-8 16:49 | 只看该作者
qq475878026 发表于 2024-5-8 16:31
就比如set1这个变量,你可以说它是0xFA,也可以说它是250都没错,但它只是存在RAM里的一个数据,按111110 ...

谢谢大家耐心指导,就是纠结进制转换问题。我先写个代码试试看
回复

使用道具 举报

11#
ID:1109793 发表于 2024-5-8 17:06 | 只看该作者
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

接收端显示和是否传输没关系,5楼的方法可以,实际上/100后不需要%10,因为一共char除100剩下的最多就是2。这样dispbuff[]中的三个数就是你要送到例如TM1650这种芯片的数据了。又或者别的比如查询到段码输出到595上面。这要看你的显示电路架构了。
回复

使用道具 举报

12#
ID:1109793 发表于 2024-5-8 17:21 | 只看该作者
xiaobendan001 发表于 2024-5-8 17:06
接收端显示和是否传输没关系,5楼的方法可以,实际上/100后不需要%10,因为一共char除100剩下的最多就是2 ...

好像不对,1650也一样要查询段码的,不好意思,用的少,忘记了。
回复

使用道具 举报

13#
ID:401564 发表于 2024-5-8 17:58 | 只看该作者
在你串口程序正确的前提下:
1,串口接收到数据,250就是250,0xFA就是0xFA,没有进制这个说法的
2,数码管显示是要查询段码再进行显示的,这个单片机的基础知识
3,你要先写好一个数码管显示程序,调试的时候先直接显示一个变量的值,不要管什么串口之类的,只管显示,先保证显示程序是OK的
4,代码先从最小的块写起,最后堆积起来就是一个完整的程序了
回复

使用道具 举报

14#
ID:705846 发表于 2024-5-8 18:01 | 只看该作者
谢谢楼上的所有大师们,是我想多的,确实是5楼方法正确。还是不要停留在想上面,要试验实践。现在可以正常显示,看起来多机通信也没有想的那么复杂。都可以同步显示。

                SendByte(temp);
                delay(1000);
                temp++;
                if(temp>250) temp=1;                       

                num[0] = temp /100%10;
                num[1] = temp /10%10;
                num[2] = temp %10;               
               
               
                Write_DATA(0,tab[num[0]]);
                Write_DATA(2,tab[num[1]]);
                Write_DATA(4,tab[num[2]]);

回复

使用道具 举报

15#
ID:883242 发表于 2024-5-8 18:39 | 只看该作者
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

不要纠结进制问题,你写的250到了单片机那里也不是十进制,一律是二进制。
回复

使用道具 举报

16#
ID:1010435 发表于 2024-5-8 21:29 | 只看该作者
C语言中250就是十进制的250,16进制要写成0xfa,0x就是16进制的标识,250+0xfa=500=0x01f4
回复

使用道具 举报

17#
ID:458247 发表于 2024-5-9 08:46 | 只看该作者
samxon 发表于 2024-5-8 18:01
谢谢楼上的所有大师们,是我想多的,确实是5楼方法正确。还是不要停留在想上面,要试验实践。现在可以正常 ...

多机通信主要难点在解决从机冲突问题,比如我想从机a显示200,从机b显示130,你就要定义一个通信协议,每个从机都要有个id才能实现了,更复杂的还有很多,比如如何校验通信数据,如何加密通信数据等
回复

使用道具 举报

18#
ID:705846 发表于 2024-5-9 17:31 来自手机 | 只看该作者
主机发,所有从机一起收就可以。暂时没用到这么复杂
回复

使用道具 举报

19#
ID:343102 发表于 2024-5-9 20:07 | 只看该作者
5楼是高手,串口用ASCII码传送数据、字符。
回复

使用道具 举报

20#
ID:1110945 发表于 2024-5-9 20:11 | 只看该作者
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

虽然你写的是十进制250,但发送端发送的不是十进制,而是0xfa,
接收端接收的是0xfa代表能正确接收,单片机可以存储或者比较这个数的大小。
在单片机里面不需要转成10进制数。
单片机不能理解你的“10进制数”,只有输出到显示设备时才要转换成“10进制”
的格式。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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