标题: 51单片机串口如何接受7位数的数据(10进制) [打印本页]

作者: 格式化无悔    时间: 2023-5-23 16:50
标题: 51单片机串口如何接受7位数的数据(10进制)
麻烦大佬给个程序参考下
作者: lkc8210    时间: 2023-5-23 17:04
1. 用联合体
2. 用字符串
作者: xuyaqi    时间: 2023-5-23 17:07
双方定义收发浮点数,串口4个字节就可实现7位10进制数收发。
作者: 123156fsadf    时间: 2023-5-23 17:19
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,buf[0] = temp_long >> 16;buf[1] = temp_long >> 8; buf[2] = temp_long & 0xFF;
然后发送这个数组就好了。接收到数据后通过左移操作还原成unsigned long变量即可
作者: 名字不是重点    时间: 2023-5-23 17:22
串口收发的都是数据,都是“16进制”,“10进制'也是当成"16进制"来收发,其实对串口来说都是2进制,根本没有x进制这个说法,有的只是后数据的处理才出现什么10进制之类的
作者: 名字不是重点    时间: 2023-5-23 17:25
卡住你的不是什么10进制,而是7位数。你可以开个缓存(7字节),收到第一个字节存入缓存第一个地址中,,,第7个存入7中。。。
作者: aking991    时间: 2023-5-24 08:28
把接收到的数据屏蔽最高位(&07F),这样不就是把8位当7位接收了,不过这种在51单片机中是不得以的方法,在高级单片机就能设置相应的接收位数
作者: wulin    时间: 2023-5-24 09:52
楼主语焉不详,地板回复应该是楼主想要的,但楼主未必能看明白。
作者: yzwzfyz    时间: 2023-5-24 10:40
串口总是按字节一个一个的接收二进制数,它可不管什么这个数那个数的花花定义。
至于7位数据什么的,关键在于你如何将这个7位数据,按字节拆分(发送时)、组合(接收时,复原)。

作者: 123456ZXC1    时间: 2023-5-24 12:31
#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);
    }
}

作者: 格式化无悔    时间: 2023-5-25 09:00
123456ZXC1 发表于 2023-5-24 12:31
#include

#define uchar unsigned char

这个是7位数啊
,怎么能uchar
作者: 格式化无悔    时间: 2024-6-6 11:40
wulin 发表于 2023-5-24 09:52
楼主语焉不详,地板回复应该是楼主想要的,但楼主未必能看明白。

努力看明白
作者: 格式化无悔    时间: 2024-6-6 16:37
123156fsadf 发表于 2023-5-23 17:19
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,b ...

数据收到了,接收到的数据是应该相加还是怎么做,前两位数据都是00H ,后两位数据如下图

image.jpg (695.98 KB, 下载次数: 22)

image.jpg

image.jpg (1.1 MB, 下载次数: 23)

image.jpg

作者: cy009    时间: 2024-6-6 20:23
用数组,多少位都可以

作者: zhuls    时间: 2024-6-6 20:55
是7位数,还是7bit?两者是不同概念的。
前者开一个缓存,依次接收趣入即可,后者自定义数据类型,按需要处理后再存入。
作者: 格式化无悔    时间: 2024-6-7 08:56
格式化无悔 发表于 2024-6-6 16:37
数据收到了,接收到的数据是应该相加还是怎么做,前两位数据都是00H ,后两位数据如下图

我现在数据接收到了(4个字节),一个字节一个字节的收到的,但是不知道怎么组合起来,是应该相加还是怎么办,怎么把这四个字节的数据组合成10进制的数
作者: 格式化无悔    时间: 2024-6-7 09:15
123156fsadf 发表于 2023-5-23 17:19
3个字节就可以了,比如1234567,你放到一个unsigned long的变量中,将右边24位分别放入一个3字节的buf中,b ...

谢谢大佬,已解决




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