打印
[STM32F1]

把历史数据读出来

[复制链接]
973|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
bqyj|  楼主 | 2021-6-9 18:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Save_Para.Integrated_flux[0]=s_bsPort.txdBuf[39]=(u8)((((water1.Cumulant_Int/10000000000)/10)<<4)| \
                        ((water1.Cumulant_Int/10000000000)%10));                        //
        Save_Para.Integrated_flux[1]=s_bsPort.txdBuf[40]=(u8)((((water1.Cumulant_Int%10000000000)/1000000000)<<4)|  \
                                        ((water1.Cumulant_Int%10000000000/100000000)%10));        ;                        //
        Save_Para.Integrated_flux[2]=s_bsPort.txdBuf[41]=(u8)((((water1.Cumulant_Int%100000000)/10000000)<<4)| \
                ((water1.Cumulant_Int%100000000/1000000)%10));
        Save_Para.Integrated_flux[3]=s_bsPort.txdBuf[42]=(u8)((((water1.Cumulant_Int%1000000)/100000)<<4)| \
                (((water1.Cumulant_Int%1000000)/10000)%10));
        Save_Para.Integrated_flux[4]=s_bsPort.txdBuf[43]=(u8)((((water1.Cumulant_Int%10000)/1000)<<4)|(water1.Cumulant_Int%10000/100%10));
        
做的水表电表,以上代码是我写的一部分。
water1.Cumulant_Int表示累积流量。s_bsPort.txdBuf是发送缓冲区,Save_Para.Integrated_flux是用来保存的。
现在还要写把历史数据读出来

使用特权

评论回复
沙发
supernan| | 2021-6-9 18:56 | 只看该作者
你有什么打算呢?或者你想知道什么?

使用特权

评论回复
板凳
bqyj|  楼主 | 2021-6-9 18:58 | 只看该作者
就是根据读出来的五个字节把water1.Cumulant_Int恢复出来。
我怎么也想不明白怎么转换。

使用特权

评论回复
地板
chuxh| | 2021-6-9 19:01 | 只看该作者
你的数太大了,不在32位整数范围内了,默认整形是处理不了的。

使用特权

评论回复
5
juventus9554| | 2021-6-9 19:07 | 只看该作者
仅供参考
#include <stdio.h>
#include <stdint.h>

uint8_t buf[5] = { 0x12, 0x34, 0x56, 0x78, 0x91 };

uint64_t convert(uint8_t* buf, int n) {
        uint64_t acc = 0;
        int i;
        uint8_t c;
        for(i=0; i<n; i++) {
                acc *= 100;
                c = buf[i];
                acc += (c >> 4) * 10 + (c & 0x0F);
        }
        return acc;
}

int main() {
        printf("%lld\n", convert(buf, 5));
}

使用特权

评论回复
6
stly| | 2021-6-9 19:09 | 只看该作者
用结构指针

使用特权

评论回复
7
llljh| | 2021-6-9 19:12 | 只看该作者
结构指针有点晕,具体怎么写?

使用特权

评论回复
8
pengf| | 2021-6-9 19:18 | 只看该作者
你这是把32位压缩BCD变为32位HEX吧

使用特权

评论回复
9
happy_10| | 2021-6-9 19:22 | 只看该作者
参考一下

uint16_t BCDTOHEXINT16(uint32_t bcd_data)
{
        uint16_t temp;
        temp= (0x0f&(bcd_data>>16))*10000;
        temp+=(0x0f&(bcd_data>>12))*1000;
        temp+=(0x0f&(bcd_data>>8))*100;
        temp+=(0x0f&(bcd_data>>4))*10;
        temp+= bcd_data&0x0f;
        return temp;
}

uint32_t HEX16TOBCD32(uint16_t hex_data)
{
        uint32_t bcd_data,temp;
        bcd_data=((uint32_t)hex_data)/10000;
        bcd_data <<=4;
        temp=hex_data%10000;
        bcd_data |=((uint32_t)temp)/1000;
        bcd_data <<=4;
        temp=temp%1000;
        bcd_data |=((uint32_t)temp)/100;
        bcd_data <<=4;
        temp=temp%100;
        bcd_data |=((uint32_t)temp)/10;
        temp=temp%10;
        bcd_data <<=4;
        bcd_data |=(uint32_t)temp;
        return bcd_data;
}

使用特权

评论回复
10
bqyj|  楼主 | 2021-6-9 19:45 | 只看该作者
哦,那我就知道怎么回事了,多谢大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

390

主题

4526

帖子

2

粉丝