标题: 单片机串口收发数据进制转换问题 [打印本页]

作者: samxon    时间: 2024-5-8 12:42
标题: 单片机串口收发数据进制转换问题
大家好,摸索很久还是没弄清楚,请教大家问题,请给予指点。谢谢大家

51单片机双机通信,

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

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

接收端
dat=SBUF;
if(dat<250){
......
}else
{
.....
}

作者: xiaobendan001    时间: 2024-5-8 15:00
发的啥收的就是啥,无论多少进制,在传输中都一样,是否转换只是你要显示的时候才有需要。比如你要在数码管上显示就要转换BCD码送给显示芯片或者要再查询出对应的段码信息送给比如595或者164这样的。或者直接送到某个端口。
作者: Graves    时间: 2024-5-8 15:17
传输没有进制说法,250换成16进制是0xFA,那么以下发送函数
(1)set1=250;SBUF=set1;(2)set1=0xFA;SBUF=set1;单片机处理过程都是一样的。
作者: samxon    时间: 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,这之间是怎么转换的。
作者: lkc8210    时间: 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;

作者: samxon    时间: 2024-5-8 16:02
lkc8210 发表于 2024-5-8 15:48
按位取值

RecBuff = SBUF;

谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要把0xFA在数码管上显示250, 是否需要转换,如果需要,是如何转换的。
作者: Graves    时间: 2024-5-8 16:07
samxon 发表于 2024-5-8 15:34
你好,谢谢你的答复,进一步请教,
比如发送端发送的是250,接收端接收的是0xFA, 接收端要把接收到的0xF ...

就是按五楼的方法,你不用纠结接收端收到的是0xFA还是250,因为接收端接收的就是一堆0和1。数码管需要显示十进制,那就把set1看成十进制,然后按五楼方法把百位十位个位分开来一个个显示。
作者: lgwd    时间: 2024-5-8 16:26
串口通讯实际也是需要协议的,自己规定的协议。不然你发送几个字节,另一台接收设备怎么解读这几个字节?
作者: Graves    时间: 2024-5-8 16:31
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

就比如set1这个变量,你可以说它是0xFA,也可以说它是250都没错,但它只是存在RAM里的一个数据,按11111010排列罢了
作者: samxon    时间: 2024-5-8 16:49
qq475878026 发表于 2024-5-8 16:31
就比如set1这个变量,你可以说它是0xFA,也可以说它是250都没错,但它只是存在RAM里的一个数据,按111110 ...

谢谢大家耐心指导,就是纠结进制转换问题。我先写个代码试试看
作者: xiaobendan001    时间: 2024-5-8 17:06
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

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

好像不对,1650也一样要查询段码的,不好意思,用的少,忘记了。
作者: Y_G_G    时间: 2024-5-8 17:58
在你串口程序正确的前提下:
1,串口接收到数据,250就是250,0xFA就是0xFA,没有进制这个说法的
2,数码管显示是要查询段码再进行显示的,这个单片机的基础知识
3,你要先写好一个数码管显示程序,调试的时候先直接显示一个变量的值,不要管什么串口之类的,只管显示,先保证显示程序是OK的
4,代码先从最小的块写起,最后堆积起来就是一个完整的程序了
作者: samxon    时间: 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]]);


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

不要纠结进制问题,你写的250到了单片机那里也不是十进制,一律是二进制。
作者: mtt661    时间: 2024-5-8 21:29
C语言中250就是十进制的250,16进制要写成0xfa,0x就是16进制的标识,250+0xfa=500=0x01f4
作者: yzw846562238    时间: 2024-5-9 08:46
samxon 发表于 2024-5-8 18:01
谢谢楼上的所有大师们,是我想多的,确实是5楼方法正确。还是不要停留在想上面,要试验实践。现在可以正常 ...

多机通信主要难点在解决从机冲突问题,比如我想从机a显示200,从机b显示130,你就要定义一个通信协议,每个从机都要有个id才能实现了,更复杂的还有很多,比如如何校验通信数据,如何加密通信数据等
作者: samxon    时间: 2024-5-9 17:31
主机发,所有从机一起收就可以。暂时没用到这么复杂
作者: 风158    时间: 2024-5-9 20:07
5楼是高手,串口用ASCII码传送数据、字符。
作者: 明日之星8    时间: 2024-5-9 20:11
samxon 发表于 2024-5-8 16:02
谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要 ...

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




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1