123156fsadf 发表于 2023-5-23 17:19 谢谢大佬,已解决 |
格式化无悔 发表于 2024-6-6 16:37 我现在数据接收到了(4个字节),一个字节一个字节的收到的,但是不知道怎么组合起来,是应该相加还是怎么办,怎么把这四个字节的数据组合成10进制的数 |
是7位数,还是7bit?两者是不同概念的。 前者开一个缓存,依次接收趣入即可,后者自定义数据类型,按需要处理后再存入。 |
用数组,多少位都可以 |
wulin 发表于 2023-5-24 09:52 努力看明白 |
123456ZXC1 发表于 2023-5-24 12:31 这个是7位数啊 ,怎么能uchar |
#include <reg52.h> #define uchar unsigned char #define uint unsigned int sbit RX = P3^0; // 串口接收引脚 uchar receivedData = 0; // 存储接收到的数据 // 串口初始化函数 void InitUART() { TMOD = 0x20; // 设置定时器1为模式2(8位自动重装) SCON = 0x50; // 设置串口工作在模式1(8位数据,可变波特率) TH1 = 0xFD; // 设置波特率为9600,晶振频率11.0592MHz TR1 = 1; // 启动定时器1 } // 串口接收中断处理函数 void UART_ISR() interrupt 4 { if (RI) { // 接收到数据 RI = 0; // 清除接收中断标志 // 获取接收到的数据 uchar data = SBUF; // 忽略最高位的数据位(第8位) receivedData = data & 0x7F; } } // 延时函数 void Delay(uint del) { uint i, j; for (i = 0; i < del; i++) { for (j = 0; j < 1827; j++) { // 空循环 } } } void main() { InitUART(); // 初始化串口 // 启用全局中断 EA = 1; // 启用串口接收中断 ES = 1; while (1) { // 在这里可以使用 receivedData 变量进行处理,比如打印到LCD等 // 这里只是简单的延时示例,可根据需要修改 Delay(100); } } |
串口总是按字节一个一个的接收二进制数,它可不管什么这个数那个数的花花定义。 至于7位数据什么的,关键在于你如何将这个7位数据,按字节拆分(发送时)、组合(接收时,复原)。 |
楼主语焉不详,地板回复应该是楼主想要的,但楼主未必能看明白。 |
把接收到的数据屏蔽最高位(&07F),这样不就是把8位当7位接收了,不过这种在51单片机中是不得以的方法,在高级单片机就能设置相应的接收位数 |
卡住你的不是什么10进制,而是7位数。你可以开个缓存(7字节),收到第一个字节存入缓存第一个地址中,,,第7个存入7中。。。 |
串口收发的都是数据,都是“16进制”,“10进制'也是当成"16进制"来收发,其实对串口来说都是2进制,根本没有x进制这个说法,有的只是后数据的处理才出现什么10进制之类的 |
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,buf[0] = temp_long >> 16;buf[1] = temp_long >> 8; buf[2] = temp_long & 0xFF; 然后发送这个数组就好了。接收到数据后通过左移操作还原成unsigned long变量即可 |
双方定义收发浮点数,串口4个字节就可实现7位10进制数收发。 |
1. 用联合体 2. 用字符串 |