samxon 发表于 2024-5-8 16:02 虽然你写的是十进制250,但发送端发送的不是十进制,而是0xfa, 接收端接收的是0xfa代表能正确接收,单片机可以存储或者比较这个数的大小。 在单片机里面不需要转成10进制数。 单片机不能理解你的“10进制数”,只有输出到显示设备时才要转换成“10进制” 的格式。 |
5楼是高手,串口用ASCII码传送数据、字符。 |
主机发,所有从机一起收就可以。暂时没用到这么复杂 |
samxon 发表于 2024-5-8 18:01 多机通信主要难点在解决从机冲突问题,比如我想从机a显示200,从机b显示130,你就要定义一个通信协议,每个从机都要有个id才能实现了,更复杂的还有很多,比如如何校验通信数据,如何加密通信数据等 |
C语言中250就是十进制的250,16进制要写成0xfa,0x就是16进制的标识,250+0xfa=500=0x01f4 |
samxon 发表于 2024-5-8 16:02 不要纠结进制问题,你写的250到了单片机那里也不是十进制,一律是二进制。 |
在你串口程序正确的前提下: 1,串口接收到数据,250就是250,0xFA就是0xFA,没有进制这个说法的 2,数码管显示是要查询段码再进行显示的,这个单片机的基础知识 3,你要先写好一个数码管显示程序,调试的时候先直接显示一个变量的值,不要管什么串口之类的,只管显示,先保证显示程序是OK的 4,代码先从最小的块写起,最后堆积起来就是一个完整的程序了 |
xiaobendan001 发表于 2024-5-8 17:06 好像不对,1650也一样要查询段码的,不好意思,用的少,忘记了。 |
samxon 发表于 2024-5-8 16:02 接收端显示和是否传输没关系,5楼的方法可以,实际上/100后不需要%10,因为一共char除100剩下的最多就是2。这样dispbuff[]中的三个数就是你要送到例如TM1650这种芯片的数据了。又或者别的比如查询到段码输出到595上面。这要看你的显示电路架构了。 |
qq475878026 发表于 2024-5-8 16:31 谢谢大家耐心指导,就是纠结进制转换问题。我先写个代码试试看 |
samxon 发表于 2024-5-8 16:02 就比如set1这个变量,你可以说它是0xFA,也可以说它是250都没错,但它只是存在RAM里的一个数据,按11111010排列罢了 |
串口通讯实际也是需要协议的,自己规定的协议。不然你发送几个字节,另一台接收设备怎么解读这几个字节? |
samxon 发表于 2024-5-8 15:34 就是按五楼的方法,你不用纠结接收端收到的是0xFA还是250,因为接收端接收的就是一堆0和1。数码管需要显示十进制,那就把set1看成十进制,然后按五楼方法把百位十位个位分开来一个个显示。 |
lkc8210 发表于 2024-5-8 15:48 谢谢你,我没有问明白。 虽然发送端发送的是十进制250,但接收端接收的是一个16进制数。也就是0xFA, 我要把0xFA在数码管上显示250, 是否需要转换,如果需要,是如何转换的。 |
samxon 发表于 2024-5-8 15:34 按位取值 RecBuff = SBUF; DispBuff[0] = RecBuff /100%10; DispBuff[1] = RecBuff /10%10; DispBuff[2] = RecBuff %10; |
qq475878026 发表于 2024-5-8 15:17 你好,谢谢你的答复,进一步请教, 比如发送端发送的是250,接收端接收的是0xFA, 接收端要把接收到的0xFA显示到数码管为250,这之间是怎么转换的。 |
传输没有进制说法,250换成16进制是0xFA,那么以下发送函数 (1)set1=250;SBUF=set1;(2)set1=0xFA;SBUF=set1;单片机处理过程都是一样的。 |
发的啥收的就是啥,无论多少进制,在传输中都一样,是否转换只是你要显示的时候才有需要。比如你要在数码管上显示就要转换BCD码送给显示芯片或者要再查询出对应的段码信息送给比如595或者164这样的。或者直接送到某个端口。 |