首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >简单的压缩算法在C中不是working..any的建议吗?

简单的压缩算法在C中不是working..any的建议吗?
EN

Stack Overflow用户
提问于 2015-08-16 03:43:07
回答 1查看 264关注 0票数 1

我在nordic Micro中创建了一个项目,该项目从模拟输入终端读取一个值,并将其输出到UART中。我现在正在尝试使用GE Proficy Compression压缩数据,以便只将更改的数据输出到UART中。但是我的代码不能工作。输出的数据有时仍然是冗余的。该程序的思想是每隔一定时间产生一个中断,读取ADC值,如果该值不同于先前的值,则将其输出到UART端口。这里解释了算法http://www.evsystems.net/files/GE_Historian_Compression_Overview.ppt处理中断的代码的主要部分如下所示

代码语言:javascript
复制
void ADC_IRQHandler(void)
{
    /* Clear dataready event */
  NRF_ADC->EVENTS_END = 0;   
    // write ADC value to UART port 

    // Compression Algorithm should occur here
    uint8_t current_Val= NRF_ADC->RESULT;
    //simple_uart_put(current_evaluation);


    // Construct error bands around the held point

    float U_tolerance = current_Val  + error_tolerance;
    float L_tolerance = current_Val - error_tolerance; // integer type is selected since lower tolerance could be negative

    if( first_Run == false)
    {
        float slope = ((current_Val - Archived_Val) / (held_Time - Archived_Time)) ;
        if (slope > U_Slope || slope > L_Slope)
        {
            Archived_Val = current_Val; // update the archived value
            held_Time = 1; // reset held time
            simple_uart_put(current_Val);
            first_Run = true;
            Archived_Val = current_Val;
        }
        else
        {
            float Upper_Slope = (U_tolerance - Archived_Val) /( held_Time - Archived_Time);
            float Lower_Slope  = (L_tolerance - Archived_Val)/(held_Time- Archived_Time);

            if(Upper_Slope < U_Slope) // lowest upper slope is always taken as a blanket boundry
            {
                U_Slope = Upper_Slope;
            }
            if(Lower_Slope < L_Slope)
            {
                L_Slope = Lower_Slope;
            }
            held_Time += time_increment;
        }
    }

    if (first_Run == true) // first held point always outputted
    {
            // calculate the slopes of the two lines 
    float Upper_Slope = (U_tolerance - Start_Up_Val) /( held_Time - Archived_Time);
    float Lower_Slope  = (L_tolerance - Start_Up_Val)/(held_Time- Archived_Time);

        // Update Max and Min slopes

    if(Upper_Slope < U_Slope) // lowest upper slope is always taken as a blanket boundry
    {
            U_Slope = Upper_Slope;
    }
    if(Lower_Slope < L_Slope)
    {
        L_Slope = Lower_Slope;
    }


    held_Time += time_increment;
    first_Run = false;
    Archived_Val = current_Val;
    }

}

可验证对象的定义如下

代码语言:javascript
复制
> uint32_t error_tolerance = 50; // error tolerance value for swining door algorithm
uint8_t Start_Up_Val = 100;
float held_Time = 1;
int Archived_Time = 0;
float U_Slope = 2500;
float L_Slope = 0;
//float slope;
uint8_t Archived_Val;
bool GE_Comp(uint8_t, uint8_t, uint8_t, int);
bool first_Run = true;
float time_increment = 0.1;
EN

回答 1

Stack Overflow用户

发布于 2015-09-07 14:20:22

感谢大家的贡献,最重要的是感谢@Weather Vane。正如您和其他人所建议的那样,中断处理程序执行了太多的代码,从而阻止了它的正常功能。现在,我按照建议将代码的各个部分分散到main函数中,从而修复了这个问题。Regareds

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32028647

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档