1-6 实验5 无线温度检测实验

2023-05-16

无线温度检测实验

1、实验内容:协调器建立ZigBee无线网络,终端节点自动加入网络,然后终端节点周期性地采集温度并将数据发送到协调器.协调器接受数据并通过串口把接受到的数据传给PC端的串口调试助手。

2、流程:协调器:开始-》建立网络-》循环接受来自终端节点的数据-》发送给串口

                 终端节点:开始-》加入网络-》周期性采集数据并发送数据到协调器

3、代码:

      协调器节点代码:在实验4的基础上添加并修改。代码如下:

      在Coordinator.h中添加TEMPERATURE数据结构

typedef union h
{
 uint8 TEMP[4];
 struct RFRXBUF
 {
  unsigned char Head;     //命令头
  unsigned char value[2]; //温度数据
  unsigned char Tail;     //命令位
 }BUF;
}TEMPERATURE;
Coordinator.c文件实现代码如下:
//Coordinator.c
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>
#include "Coordinator.h"
#include "DebugTrace.h"

#if !defined(WIN32) 
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
  GENERICAPP_CLUSTERID 
};

//简单设备描述符(描述一个ZigBee设备节点)
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  GENERICAPP_MAX_CLUSTERS,
 (cId_t*)GenericApp_ClusterList, //?????
  0,
  (cId_t *)NULL
};

endPointDesc_t GenericApp_epDesc;//节点描述符
byte GenericApp_TaskID;//任务优先级
byte GenericApp_TransID;//数据发送序列号。


void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pckt);//消息处理函数
void GenericApp_SendTheMessage(void);//数据发送函数


void GenericApp_Init(byte task_id)//任务初始化函数
{
  GenericApp_TaskID     =task_id;   //初始化任务优先级(任务优先级有协议栈的操作系统OSAL分配)
  GenericApp_TransID    =0;         //发送数据包的序号初始化为0
  //对节点描述符进行初始化
  GenericApp_epDesc.endPoint    =GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id     =&GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc   =(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq  =noLatencyReqs;
  afRegister(&GenericApp_epDesc);//afRegister()对节点的描述符进行注册。注册后,才能使用OSAL提供的系统服务。
  
  halUARTCfg_t uartConfig;//该结构体变量是实现 串口的配置
  //串口的初始化
  uartConfig.configured   =TRUE;
  uartConfig.baudRate     =HAL_UART_BR_115200;//波特率
  uartConfig.flowControl  =FALSE;             //流控制
  uartConfig.callBackFunc =NULL; //本实验就不用回调函数了!!!
  HalUARTOpen(0,&uartConfig);                 //串口是否打开
}


//消息处理函数    
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
{
  afIncomingMSGPacket_t* MSGpkt;//MSGpkt用于指向接收消息结构体的指针
  if(events&SYS_EVENT_MSG)
  {
     MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);//osal_msg_receive()从消息队列上接收消息
   while(MSGpkt)
   {
     switch(MSGpkt->hdr.event)
    {
    case AF_INCOMING_MSG_CMD:          //接受到新数据的消息的ID是AF_INCOMING_MSG_CMD,这个宏是在协议栈中定义好的值为0x1A
                                       //接受到的是无线数据包
      GenericApp_MessageMSGCB(MSGpkt);//功能是完成对接受数据的处理
      break;
    default:
      break;
    }  
    osal_msg_deallocate((uint8 *)MSGpkt);//接收到的消息处理完后,释放消息所占的存储空间    
     MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    //处理完一个消息后,再从消息队列里接受消息,然后对其进行相应处理,直到所有消息处理完
   }
   return (events ^ SYS_EVENT_MSG);
  }
   return 0;
}

void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt)
{
  unsigned char buffer[2];
  buffer[0]='\r';
  buffer[1]='\n';
 // unsigned char buffer[2]={0x0A,0x0D};//回车换行符的ASCII码
//上面两种都是赋值为回车和换行符,它们的结果都是一样的。在串口中显示的是ASCII码值:0x0A,0x0D,而不是真正的换行。这个应该跟串口的这个软件设计编写时有关。

  TEMPERATURE temperature;  
  
 switch(pkt->clusterId)
 {
     HalLedBlink(HAL_LED_1,0,50,500);    //LED2 闪烁 
 case GENERICAPP_CLUSTERID:
   osal_memcpy(&temperature,pkt->cmd.Data,sizeof(temperature));//把pkt->cmd.Data的数据复制到buffer
   HalUARTWrite(0,(uint8*)&temperature,sizeof(temperature));//要注意这个(uint8*)&temperature,我是这样写的(uint8)temperature,是不对的
   HalUARTWrite(0,buffer,2);//发送回车换行符  
   HalLedBlink(HAL_LED_2,0,50,500);    //LED2 闪烁   
   break;
 }
}
上面要注意的是:
 TEMPERATURE temperature;//TEMPERATURE内是联合结构体,这样就为(uint8*)&temperature提供了便利。
osal_memcpy(&temperature,pkt->cmd.Data,sizeof(temperature));//把pkt->cmd.Data的数据复制到buffer
HalUARTWrite(0,(uint8*)&temperature,sizeof(temperature));//要注意这个(uint8*)&temperature,我是这样写的(uint8)temperature,是不对的

终端节点代码:在实验4 串口通信2的基础上添加修改代码。代码如下:

添加Senor.h头文件,代码如下:

//Sensor.h
#ifndef SENSOR_H
#define SENSOR_H
#include <hal_types.h>
extern int8 readTemp(void);
#endif

添加Senor.c实现文件,代码如下:

//Senor.c
#include "Sensor.h"
#include <ioCC2530.h>
#define HAL_ADC_REF_115V 0x00
#define HAL_ADC_DEC_256  0x20
#define HAL_ADC_CHN_TEMP 0x0e
int8 readTemp(void)
{
 static uint16 reference_voltage;
 static uint8  bCalibrate=TRUE;
 uint16 value;
 int8 temp;

 ATEST=0x01;  //使能温度传感器
 TR0|=0x01;   //连接温度传感器
 ADCIF=0;     //?????
 ADCCON3=(HAL_ADC_REF_115V|HAL_ADC_DEC_256|HAL_ADC_CHN_TEMP);//???????
 while(!ADCIF)//???????
   ;
 ADCIF=0;
 value=ADCL;                   //这里应该是取低位
 value |=((uint16)ADCH)<<8;   //这里应该是取高位
 value>>=4;//除以16???
 if(bCalibrate)//记录第一次读取的温度值,用于校正温度数据
 {
   reference_voltage=value;
   bCalibrate=FALSE;   
 }
 
 temp=22+((value-reference_voltage)/4);//温度校正函数
 return temp;
}

上面代码分析:CC2530内部自带有温度传感器。使用温度传感器的步骤:1、使能温度传感器;2、连接温度传感器;3、初始化ADC,确定参考电压、分辨率、启动ADC读取温度数据等。4、校正温度数据。

修改Enddevice.c文件,代码如下:

//Enddevice.c
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include <string.h>

#include "Coordinator.h"

#include "DebugTrace.h"

#if !defined(WIN32)
#include "OnBoard.h"
#endif

#include "hal_lcd.h"
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
#include "Sensor.h"

#define SEND_DATA_EVENT 0x01  //发送事件id

const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS]=
{
 GENERICAPP_CLUSTERID
};

//初始化端口描述符
const SimpleDescriptionFormat_t GenericApp_SimpleDesc=
{
  GENERICAPP_ENDPOINT,
  GENERICAPP_PROFID,
  GENERICAPP_DEVICEID,
  GENERICAPP_DEVICE_VERSION,
  GENERICAPP_FLAGS,
  0,
  (cId_t*)NULL,
  GENERICAPP_MAX_CLUSTERS,
  (cId_t*)GenericApp_ClusterList  
};

endPointDesc_t GenericApp_epDesc;//节点描述符
byte GenericApp_TaskID;          //任务优先级
byte GenericApp_TransID;         //数据发送序列号
devStates_t GenericApp_NwkState;//保存节点状态

void GenericApp_MessageMSGCB(afIncomingMSGPacket_t* pckt);//消息处理函数的声明
void GenericApp_SendTheMessage(void); //数据发送函数的声明

//任务初始化函数
void GenericApp_Init(byte task_id)
{
  GenericApp_TaskID     = task_id;//初始化任务优先级
  GenericApp_NwkState   =DEV_INIT; //初始化为DEV_INIT,表节点没有连接到ZigBee网络
  GenericApp_TransID    =0;        //发送数据包的序列号初始化为0
  //对节点描述符进行初始化
  GenericApp_epDesc.endPoint=GENERICAPP_ENDPOINT;
  GenericApp_epDesc.task_id =&GenericApp_TaskID;
  GenericApp_epDesc.simpleDesc=(SimpleDescriptionFormat_t*)&GenericApp_SimpleDesc;
  GenericApp_epDesc.latencyReq=noLatencyReqs;
  //afRegister()函数将节点描述符进行注册,注册后才可以使用OSAL提供的系统服务
  afRegister(&GenericApp_epDesc);
}

//消息处理函数
UINT16 GenericApp_ProcessEvent(byte task_id,UINT16 events)
{
  afIncomingMSGPacket_t* MSGpkt;
  if(events&SYS_EVENT_MSG)
  {
    MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    
    while(MSGpkt)
    {
      switch(MSGpkt->hdr.event)
      {
    case ZDO_STATE_CHANGE:
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型
      if(GenericApp_NwkState==DEV_END_DEVICE)
      {
        //当中断节点加入网络后使用osal_set_envent()函数设置SEND_DATA_EVENT事件,当事件发生时,执行事件处理函数
        osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//??????????????????????????
        //GenericApp_SendTheMessage(); //终端节点类型,执行无线数据发送
      }
      break;
    default:
      break;
      }
    osal_msg_deallocate((uint8*)MSGpkt);
    MSGpkt=(afIncomingMSGPacket_t*)osal_msg_receive(GenericApp_TaskID);
    }
    return (events^SYS_EVENT_MSG);
  }
  
  if(events&SEND_DATA_EVENT)//这个函数为什么放在这里,好好想想才行????
  {
   GenericApp_SendTheMessage();
   osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,1000);
   //定时器,三个参数:一参:表定时事件到底后,那个任务对其作出响应
   //二参:时间ID,表时间达到后,事件发生,该事件的处理函数中实现数据的发送。
   //三参:定时的时间数量,单位毫秒。
   return (events^SEND_DATA_EVENT);//清除事件标志
  }
  return 0;
}

void GenericApp_SendTheMessage(void)
{
  unsigned char theMessageData[10]="EndDevice";//存放发送数据
  int8 tvalue;                   //存储温度
  TEMPERATURE temperature;       //温度数据包
  temperature.BUF.Head='&';      //命令头
  tvalue=readTemp();             //读取温度 
  temperature.BUF.value[0]=tvalue/10+'0';//高位  十位    //将温度转化为ASCII
  temperature.BUF.value[1]=tvalue%10+'0';//个位
   temperature.BUF.Tail='C';              //尾部
  
  afAddrType_t my_DstAddr;    
  my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//数据发送模式:可选 单播、广播、多播方式  这里选Addr16Bit表单播
  my_DstAddr.endPoint=GENERICAPP_ENDPOINT;   //初始化端口函
  my_DstAddr.addr.shortAddr=0x0000;  //标志目的地址节点的网络地址  这里是协调器的地址  

  AF_DataRequest(&my_DstAddr,&GenericApp_epDesc,GENERICAPP_CLUSTERID,\
  sizeof(temperature),(uint8 *)&temperature,&GenericApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS);
      HalLedBlink(HAL_LED_2,0,50,500);    //LED2 闪烁   
}

上面代码分析:主要是
 tvalue=readTemp();             //读取温度 

就行啦,实现温度数据的封装,就可以发送出去啦。

4、实验结果(串口调试助手显示的接收到并显示的是:26 32 36 43 0D 0A 这个些都是ASCII码值,表示的字符为& 2 6 C /r (回车) /n(换行),且使用十六进制表示的)


总结一下,分别给协调器节点和终端节点下载好代码后 ,串口调试助手并未显示已接收到有数据,但两节点的led2灯都已闪烁,表发送和接收都成功。原因是上一次打开的串口调试助手每一次下载后都必须断开再打开。这个花了我不少时间呀!!!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

1-6 实验5 无线温度检测实验 的相关文章

  • windows下怎么查看exe是32位还是64位

    xxx exe用记事本或notepad打开 xff0c 找有字符的第二行中 PE 字符串旁边 xff0c 如果是 d xff0c 则为64位 xff1b 如果是 L xff0c 则为32位
  • 无法定位程序输入点 _ZNSt7__cxx1118basic_stringstreamIcSt11char_traitsIcESaIcEEC1Ev于动态链接库

    在执行编译出来的exe时 xff0c 报了 无法定位程序输入点 ZNSt7 cxx1118basic stringstreamIcSt11char traitsIcESaIcEEC1Ev于动态链接库 的异常 出现这个问题时 xff0c 应该
  • 踩了个C++的未定义标识符"cout"的坑

    问题表现 没怎么用过C 43 43 写过完整的项目 xff0c 今天闲来无事 xff0c 便创建个c 43 43 的工程玩玩 xff0c 结果一个简单的打印输出就给卡住了 xff0c 无法打开文件 iostream h xff0c cout
  • Electron-Vue之安装流程

    近期摒弃了熟悉的WPF xff0c 选用了新的一套工具 xff08 Electron Vue xff09 来开发桌面软件 xff08 我是连html都没用过的猿 xff0c no zuo no die xff09 接触新的东西 xff0c
  • vscode的调试配置

    文章目录 vscode的调试配置文件调试配置选项 vscode的调试配置文件 vscode的调试配置存储在 vscode文件夹的launch json文件中 通过以下步骤可以创建一个调试配置 xff1a 切换到调试视图单击create a
  • C/C++实现strcpy和strcat两个功能

    strcpy和strcat是string h头文件中分别实现字符串数组拷贝与拼接功能的函数 xff0c 详细使用相信大家都了解了 xff0c 如果还不了解看看实例 C C 43 43 笔试必须熟悉掌握的头文件系列 xff08 四 xff09
  • C/C++锁机制(boost)的认知和使用

    锁扩充 加锁的必需考虑三个问题 该锁的不锁 xff0c 将会导致各种莫名其妙的错误 xff1b 加锁范围太大 xff0c 虽然能避免逻辑错误 xff0c 但如果锁了不该锁的东西 xff0c 难免会降低程序的效率 xff1b 加锁方式不合适
  • QT之GPS

    http blog sina com cn s blog 7da13b510100xtgr html 前几天发现手里还闲着一块GPS 佳明的15W 也不知道是好的还是坏的呵呵一时兴起我就趁周六日没什么事情 用qt做了一个界面 现在已经调试完
  • 关于tcp/udp网络调试助手错误提示

    最近在学习网络调试助手与虚拟机中的Ubuntu系统通信 xff0c 在使用Ubuntu做服务器端时 xff0c tcp以及udp协议都遇到了问题 1 tcp协议遇到的问题是 xff1a 网络调试助手提示 xff1a 1035未知错误 xff
  • 结构体和结构体链表

    在c语言表针中有多种数据类型 xff0c 他们的应用使变量的应用变得灵活多变 而除了c语言默认的int xff0c float 等类型外 xff0c 我们还可以自己定义一些数据的类型 xff0c 结构体类型便是可以实现数据类型自定义的类型
  • 串口通信UART

    串口基本概念 串口通讯 Serial Communication 是指外设和计算机间 xff0c 通过数据信号线 地线等 xff0c 按位进行传输数据的一种通讯方式 其通讯协议可分层为协议层和物理层 物理层规定通信协议中具有机械 电子功能的
  • 一、Fmcw毫米波雷达原理

    0 概念 FMCW Frequency Modulated Continuous Wave xff0c 即调频连续波 FMCW技术和脉冲雷达技术是两种在高精度雷达测距中使用的技术 其基本原理为发射波为高频连续波 xff0c 其频率随时间按照
  • Makefile和CMake

    Makefile makefile主要规则 xff1a 伪对象 PHONY clean 规则1 main main o gcc main o o main 规则2 main o main c gcc c main c o main o 规则
  • C语言基础——结构体

    结构体的作用 在需要表示一些复杂信息时 xff0c 使用单纯的数据类型很不方便 比如 xff1a 学生信息 xff08 学号 xff0c 姓名 xff0c 班级 xff0c 电话 xff0c 年龄 xff09 xff1b GPIO信息 xf
  • Nginx 通过 header 中的标识进行分发

    Nginx可以根据请求头中自定义的标识将请求分发到不同的服务器 具体来说 xff0c 可以使用map指令将请求头中的自定义标识映射为不同的后端服务器地址 xff0c 然后使用proxy pass指令将请求转发到对应的后端服务器 以下是一个示
  • DB9接口详解---DB9引脚在 UART,CAN,RS485中的定义

    DB9的公母如下 xff1a 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61 61
  • 超强整理!PCB设计之电流与线宽的关系

    关于pcb线宽和电流的经验公式 xff0c 关系表和软件网上都很多 xff0c 本文把网上的整理了一下 xff0c 旨在给广大工程师在设计PCB板的时候提供方便 以下总结了八种电流与线宽的关系公式 xff0c 表和计算公式 xff0c 虽然
  • nginx 主动健康检查搭建详解(nginx_upstream_check_module)

    版本信息 nginx 1 21 1 下载nginx upstream check module模块 nginx upstream check module master zip wget https codeload github com
  • paddle推理部署(cpu)

    我没按照官方文档去做 xff0c 吐槽一下 xff0c 官方文档有点混乱 一 概述 总结起来 xff0c 就是用c 43 43 示例代码 xff0c 用一个模型做推理 二 示例代码下载 https www paddlepaddle org
  • Vector的用法

    我不知道大家是怎么理解Vector和怎样使用的 xff0c 这篇文章主要是发表我自己对于Vector的看法 xff0c 仅仅属于个人理解 xff0c 如果有什么错误 xff0c 也希望大家指正哈 目录 1 xff1a Vector的概念 2

随机推荐

  • float的表示

    xfeff xfeff 先说一下计算机中二进制的算法 xff1a 整数 整数的二进制算法大家应该很熟悉 xff0c 就是不断的除以2取余数 xff0c 然后将余数倒序排列 比如求9的二进制 xff1a 9 2 61 4 余 1 4 2 61
  • cmake系列(三)

    目录 多个源文件 同一目录 xff0c 多个源文件 多个源文件 同一目录 xff0c 多个源文件 本小节对应的源代码所在目录 xff1a Demo2 上面的例子只有单个源文件 现在假如把 power 函数单独写进一个名为 MathFunct
  • ORACLE 字符串聚合函数 strcat

    create or replace type strcat type as object currentstr varchar2 4000 currentseprator varchar2 8 static function ODCIAgg
  • 无人机器件选择参考

    无人机飞控 xff0c 引脚预留数量 1 xff0c 四路pwm 2 xff0c 无线通信spi 3 xff0c 陀螺仪通信用iic 4 xff0c 串口调试用uart 5 xff0c led灯用普通io 6 xff0c 电量检测和电机堵塞
  • 字节对齐的规则总结

    一 什么是字节对齐 为什么要对齐 现代计算机中内存空间都是按照byte划分的 xff0c 从理论上讲似乎对任何类型的变量的访问可以从任何地址开始 xff0c 但实际情况是在访问特定类型变量的时候经常在特定的内存地址访问 xff0c 这就需要
  • C++中第三方库的一般使用方式(libxl库为例)

    本篇介绍如何使用C C 43 43 的第三方库 xff0c 学会使用第三方库很重要 xff0c 尤其对于使用C C 43 43 语言的人来说 xff0c 标准库能做的事不能说太少 xff0c 恰当的说应该是没那么有趣 学会使用第三方库 xf
  • 三相电动机用单相电源

    三相电机改为单相运行 单相电机配用电容不是越大越好 三相电动机用单相电源 三相电机改为单相运行 介绍几种简便易行的方法 xff0c 可以不改动电机内部绕组而将三相电机改为单相运行 有6 种 xff1a 一 加电容法 xff39 形接法的三相
  • curl_init()和curl_multi_init()多线程的速度比较

    来源 http www webkaka com tutorial php 2013 102843 php中curl init 的作用很大 xff0c 尤其是在抓取网页内容或文件信息的时候 xff0c 例如之前文章curl获得header检测
  • 连接两字符串函数

    include lt stdio h gt include 34 string h 34 char Strcat char s1 char s2 printf 34 连接之后的字符串为 xff1a 34 for s1 61 39 0 39
  • CAN通信数据帧介绍

    CAN通信有五个帧 xff0c 其中最重要的是数据帧 xff01 xff01 xff01 xff01 我们下面开始讨论数据帧 一 数据帧的格式 xff08 数据帧有七个段组成 xff09 xff0c 帧起始 表示数据帧开始的段 xff0c
  • STM32压力传感器信号采集-24位AD HX720 HX711 原理介绍

    我做过很多工业用压力采集产品 xff0c 用过很多高分辨率的AD芯片 xff0c 其中有两款值得推荐 一个是海芯科技出的HX711等24位AD xff0c 一个是塞普拉斯出的CS5532等24位AD 国产芯片和进口芯片有差距 xff0c 但
  • stm32实现网络音频-原理图单片机程序C#上位机程序

    电子可以一边玩 xff0c 一边研究 xff0c 网络音频这个课题特别适合电子爱好者 几方面的挑战如下 xff0c 单片机实现对接以太网 实时对音频流解码播放 xff0c 上位机配合单片机做音频流传输控制 xff0c 音频信号的对接放大处理
  • rosdep init and update Error

    rosdep init Error sudo rosdep init ERROR default sources list file already exists br etc ros rosdep sources list d 20 de
  • Postman汉化版本竟如此简单,全中文真香

    对于国内程序员来说 xff0c 外国开发软件的一个使用门槛是全英文的 xff0c 对于不熟悉各种专业术语的同学 xff0c 上手比较麻烦 因此有种方法就是使用汉化版的外国软件 xff0c 但 Postman 并没有汉化版本 但是postma
  • YOLOv5识别目标的实时坐标打印

    引言 这个功能看似鸡肋 xff0c 但对于无人机目标识别与追踪有重要意义 xff0c 通过目标在摄像头视野的坐标位置 xff0c 可以推算出无人机相对与目标的位置 xff0c 从而对无人机进行位置矫正 因此 xff0c 添加代码打印坐标并不
  • 六、WebRTC中ICE的实现

    一 Candidate种类 amp 优先级 高到底 xff1a host srflx prflx relay 同一局域网内通过host类型的Candidate在内网建立连接 非同一局域网 xff0c 隔断从STUN TURN服务器中收集sr
  • 七、WebRTC中的SDP

    一 SDP标准规范 格式 xff1a lt type gt 61 lt value gt SDP 会话层 媒体层 媒体音频 媒体视频 二 WebRTC中的SDP的整体结构 1 媒体信息 m 61 行中描述媒体类型 传输类型 Playload
  • linux 信号量sem

    一 信号量 信号量如同一盏红绿信号灯 xff0c 用于临界资源 xff08 如公路 人行道 xff09 的管理 信号量是一种特殊的变量 xff0c 访问具有原子性 P等待 xff1a 信号量的值为0时 xff0c 不能减 xff0c 则进行
  • 1-4 实验3 串口通信

    串口通信 1 实验内容 xff1a PC端串口调试助手向板子发送数据 xff0c 板子接受到数据后 xff0c 再把数据发送回给PC端串口调试助手 2 串口发送接受数据的基本步骤 xff1a 初始化串口 xff08 设置波特率 中断等 xf
  • 1-6 实验5 无线温度检测实验

    无线温度检测实验 1 实验内容 xff1a 协调器建立ZigBee无线网络 xff0c 终端节点自动加入网络 xff0c 然后终端节点周期性地采集温度并将数据发送到协调器 协调器接受数据并通过串口把接受到的数据传给PC端的串口调试助手 2