Redy_Hello
Redy_Hello
采纳率50%
2017-02-20 05:09 阅读 1.8k

关于cc2530平台contiki编写ds18b20温度传感器的问题

5

各位大大,小弟需要采用cc2530板子读取ds18b20温度值并将之发送到服务器。其中,cc2530裸机测试ds18b20温度值无问题,能正确读取数值,如下:
图片说明

放到contiki中,出现问题如下:
图片说明

图片说明
以下是部分代码:

 PROCESS_THREAD(udp_sender_process, ev, data)
{
  static struct uip_ds6_notification n;
  static struct udp_socket s;

  PROCESS_BEGIN();

  leds_on(LEDS_ALL);

  set_global_address(); //设置IP地址

  uip_ds6_notification_add(&n, route_callback);

  /* Register UDP socket callback */
  udp_socket_register(&s, NULL, receiver);

  /* Bind UDP socket to local port */
  udp_socket_bind(&s, DATA_CLIENT_PORT);

  /* Connect UDP socket to remote port */
  udp_socket_connect(&s, NULL, DATA_SERVER_PORT);

  while(1) {   
    PROCESS_WAIT_EVENT_UNTIL(ev == event_data_ready);

    sprintf(databuf,"temp=%s", data);
    udp_socket_sendto(&s, // socket
                        databuf, 16, //数据指针,实际数据长度
                        &udp_server_addr, DATA_SERVER_PORT);// 服务器地址,服务器端口
  }

  PROCESS_END();
}
/*---------------------------------------------------------------------------*/

PROCESS_THREAD(read_ds18b20_process, ev, data)
{
  static unsigned char ucTemp;
  static float fTemp;
  static char strTemp[8];

  PROCESS_BEGIN();

  event_data_ready = process_alloc_event();

  etimer_set(&et_read_ds18b20, CLOCK_SECOND);

  while(1){

    memset(strTemp, 0, ARRAY_SIZE(strTemp));

    PROCESS_WAIT_EVENT_UNTIL(ev == PROCESS_EVENT_TIMER);

#if defined(FLOAT_TEMP)
    fTemp = floatReadDs18B20();
    memcpy(strTemp, &fTemp, sizeof(fTemp));
#else
    ucTemp = ReadDs18B20();
    strTemp[0] = ucTemp/10+48;  //取出十位数
    strTemp[1] = ucTemp%10+48;  //取出个位数
#endif

    process_post(&udp_sender_process, event_data_ready, &strTemp);

    etimer_reset(&et_read_ds18b20);
  }
  PROCESS_END();
}

上述代码非原创,小弟软件大四生一枚,之前并无类似开发经验,因项目需求得实现上述内容,若问的问题相当小白,也恳请大大们帮忙提供解决思路。

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享

5条回答 默认 最新

  • shen_wei shen_wei 2017-02-20 08:01
     #if defined(FLOAT_TEMP)
        fTemp = floatReadDs18B20();
        sprintf(strTemp, "%.01f", fTemp);
    #else
        ucTemp = ReadDs18B20();
        strTemp[0] = ucTemp/10+48;  //取出十位数
        strTemp[1] = ucTemp%10+48;  //取出个位数
    #endif
    
    

    看这里的转换关系。。。temp = 1002,这里你得去计算

    点赞 评论 复制链接分享
  • shen_wei shen_wei 2017-02-20 09:13

    ReadDs18B20 温度的原始值这两个函数是否一致哪??

    点赞 评论 复制链接分享
  • wonderqu wonderqu 2017-07-27 08:33

    在下需要此代码资源,能否共享?感激不尽!

    点赞 评论 复制链接分享
  • Mr_NeoSkye Mr_NeoSkye 2017-07-30 05:26

    兄弟,能否把完整代码分享参考一下,在此感谢!!!

    点赞 评论 复制链接分享
  • wenwh33bk wenwh33bk 2018-02-07 12:35

    您好,我想请教strTemp[0] = ucTemp/10+48,其中48是什么意思?

    点赞 评论 复制链接分享