Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在基于CC2538的远程主板中使用浮点,用于带有Contiki OS的CoAP服务器_C_Contiki_Coap - Fatal编程技术网

在基于CC2538的远程主板中使用浮点,用于带有Contiki OS的CoAP服务器

在基于CC2538的远程主板中使用浮点,用于带有Contiki OS的CoAP服务器,c,contiki,coap,C,Contiki,Coap,我正在使用。我正在将其与Adafruit BNO055绝对方向传感器连接 我特别想要: 加速计数据以浮点精度显示 浮点精度下的欧拉角 我做了一些深入研究,发现Contiki中的printf依赖于电路板,没有多少电路板具有浮点打印实现 但是,这对于创建CoAP资源可能变得至关重要,因为返回数据时代码使用snprintf 片段: /*GET Method*/ RESOURCE(res_bno055, "title=\"BNO055 Euler\";rt=\"bno055\"", r

我正在使用。我正在将其与Adafruit BNO055绝对方向传感器连接

我特别想要:

  • 加速计数据以浮点精度显示
  • 浮点精度下的欧拉角
  • 我做了一些深入研究,发现Contiki中的
    printf
    依赖于电路板,没有多少电路板具有浮点打印实现

    但是,这对于创建CoAP资源可能变得至关重要,因为返回数据时代码使用
    snprintf

    片段:

    /*GET Method*/
    
    RESOURCE(res_bno055,
        "title=\"BNO055 Euler\";rt=\"bno055\"",
        res_get_handler,
        NULL,
        NULL,
        NULL);
    
    static void res_get_handler(void *request, void *response, uint8_t *buffer,
    uint16_t preferred_size, int32_t *offset) {
    
       adafruit_bno055_vector_t euler_data = getVector(VECTOR_EULER);
       double eu_x = euler_data.x;
       double eu_y = euler_data.y;
       double eu_z = euler_data.z;
    
       unsigned int accept = -1;
    
       REST.get_header_accept(request, &accept);
    
       if(accept == -1 || accept == REST.type.TEXT_PLAIN) {
            /*PLAIN TEXT Response*/
            REST.set_header_content_type(response, REST.type.TEXT_PLAIN);
            // >>>>>>>>>>will snprintf create a problem? <<<<<<<<<<<<<<<<<
            snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "%lf, %lf, %lf",eu_x,eu_y, eu_z,);
            REST.set_response_payload(response, (uint8_t *)buffer, strlen((char *)buffer));
       } else if (accept == REST.type.APPLICATION_JSON) {
            /*Return JSON REPONSE*/
            REST.set_header_content_type(response, REST.type.APPLICATION_JSON);
            // >>>>>>>>>>>>>>>same question here.. <<<<<<<<<<<<<<<<<<<<<<<<<<<<
            snprintf((char *)buffer, REST_MAX_CHUNK_SIZE, "{'bno055_eu':{ 'X':%f, 'Y':%f, 'Z':%f}}",
            eu_x,  eu_y, eu_z);
            REST.set_response_payload(response, buffer, strlen((char *)buffer));
       } else {
            REST.set_response_status(response, REST.status.NOT_ACCEPTABLE);
            const char *msg = "Only text/plain and application/json";
            REST.set_response_payload(response, msg, strlen(msg));
       }
    }
    
    json响应:

    结构

    typedef struct {
        double x;
        double y;
        double z;
    }adafruit_bno055_vector_t
    
    使用浮点响应创建GET CoAP资源的最佳方法是什么

    @eugene nikolaev我只是在玩可用的例子。我不确定您的意思,但我认为set_payload_response()函数可能不接受double的值。如果你能给我一个如何进行的提示,我可以试试

    我对C语言不是很有经验,所以我无法向您展示一个好的代码片段。但您正在将缓冲区强制转换为(uint8_t),并且确定set_payload_response会获取二进制有效负载

    它会是这样的(我再次指出,它可能不太正确):

    但它只适用于您的
    else
    分支

    在CoAP的经典含义中,我用于发送二进制有效负载或CBOR编码的有效负载,并在类似情况下在另一侧解析它。这完全取决于你的CoAP同龄人是什么以及你想要实现什么

    UPD:关于明文/json分支,我建议您检查模块提供的值的范围/精度。也许像@Lundin所说的那样使用double没有什么意义


    另外,您真的需要纯文本和json格式吗?

    为什么需要浮点?对于给定的代码来说,这远不是显而易见的。你需要做三角计算或类似的计算吗?我不相信指定板上的MCU有FPU,所以浮点将导致糟糕的性能。一个原因是亚GHz的可用性。另一个问题是,该应用程序将用于船上,在船上,加速计的更高精度至关重要。亚GHz无线电与浮点有什么关系?浮点运算究竟是如何提高精度的?因为众所周知,它们会降低精度。而且你的加速计没有64位分辨率,更可能是12位左右。所以,无论你在软件中做什么,你都不会得到比这更好的解决方案。我理解。谢谢亚GHz点有故障。道歉。我的意思是,该板是唯一一个在同一块板上提供亚GHz和2.4 GHz无线设备的板。如果我完全弄错了,很抱歉,但是为什么您需要sprintf呢?为什么不以字节的形式发送浮点值呢?+1表示CBOR。我认为JSON是传感器值的良好数据表示格式,因此我可以使用CoAP客户端轮询服务器,并在客户端收集信息进行一些分析。除此之外,我对任何方式的数据格式都持开放态度。
    {'bno055_eu: { 'X': , 'Y': , 'Z': }}
    
    typedef struct {
        double x;
        double y;
        double z;
    }adafruit_bno055_vector_t
    
    REST.set_response_payload(response, (uint8_t *) &euler_data, sizeof(adafruit_bno055_vector_t));