Redy_Hello 2017-02-20 05:09 采纳率: 50%
浏览 1822
已结题

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

各位大大,小弟需要采用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 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,这里你得去计算

    评论

报告相同问题?

悬赏问题

  • ¥50 易语言把MYSQL数据库中的数据添加至组合框
  • ¥20 求数据集和代码#有偿答复
  • ¥15 关于下拉菜单选项关联的问题
  • ¥20 java-OJ-健康体检
  • ¥15 rs485的上拉下拉,不会对a-b<-200mv有影响吗,就是接受时,对判断逻辑0有影响吗
  • ¥15 使用phpstudy在云服务器上搭建个人网站
  • ¥15 应该如何判断含间隙的曲柄摇杆机构,轴与轴承是否发生了碰撞?
  • ¥15 vue3+express部署到nginx
  • ¥20 搭建pt1000三线制高精度测温电路
  • ¥15 使用Jdk8自带的算法,和Jdk11自带的加密结果会一样吗,不一样的话有什么解决方案,Jdk不能升级的情况