tag 标签: 数据通信

相关帖子
相关博文
  • 热度 8
    2023-3-6 08:57
    459 次阅读|
    0 个评论
    相干光学照亮了高速数据通信的路径 相干光学在以前只有在极长的洲际和海底连接中才体现出成本效益。最近,提高数据传输速度、延长通道长度和增加系统容量方案得到新的发展,使得设计者更容易采用这类解决方案。 高性能计算和电信设备的设计者,以及互联网服务提供商,一直在寻找提高数据传输速度、扩展信道长度、增加系统容量、优化信号保真度和降低功耗的方法。这一探索导致了更多采用 光纤 连接。 在其最简单的形式中,光信道由一个组件完成,它将信息转换为一系列表示1或0的二进制光脉冲。非归零(NRZ)PAM2调制多年来一直是光数据通道的主导地位。 这种形式光通信被称为直接检测(direct detect ),并已成为电信和数据中心光互连中的主要通信链路。 像这样的简单链接对于单个数据流是理想的,但是数据中心和电信网络需要尽可能高效地将大文件高速传输。 安装更多光纤来扩大容量是一种有效但代价昂贵的解决方案。并行多极光纤可增加总信道带宽,但体积也增加了。光纤电缆可能包含1到3000多根光纤,这对于大型数据中心的电缆托盘提出挑战。获得许可证、通行权的使用权和安装新的外部 光缆 所需的成本和时间,使得寻求通过每根现有光纤传输尽可能多的数据势在必行。 数据信道的容量可以通过几种方式来增加,例如增加每秒传输的符号数或信号变化,或增加每个符号传输的比特数。增加每秒数据量需要增加频率,这可到导致信号完整性问题,并限制了链路的有效范围。 直接检测光信令的性能可以通过使用先进的振幅调制方案来提高。在给定的波特率下,通过加倍比特率来提高每个时钟周期效率的能力使得PAM4调制被广泛采用。 PAM4信令已成为在铜通道和光纤通道中实现56+Gb数据速率的首选机制。标准组织和MSA组织,包括OIF、PCIe、InfiniBand和Ethernet,已经在最新规范中采用PAM4调制。 在许多数据中心,使用直接检测技术的单个光纤传输带宽已经开始达到实际极限。为了进一步支持高速和高容量的连接性需求,已经开发出了先进的光纤。 替代传统单核光纤的一种方法是引入多核光纤(MCF),它在一根光纤中集成了多个并行光纤。 多芯光纤允许在同一包层下通过不同的芯同时传输不同信号。其结果是增加了每个光纤的数据传输密度。 多核光纤制造和终端方面的进步使其成为传统单芯光纤更经济可行的替代方案。 包括中空芯光纤的光纤结构正在发展,比如,用空气填充毛细管取代标准玻璃芯。由于光在空气中传播速度快50%,这种独特的光纤是正在寻找极低信号延迟应用的理想方案。 提高各光纤的光谱效率已成为提高光信道数据容量的一个重点。波分多路复用(W DM )已被证明是一种高效的解决方案。而不是通过光纤发送单一波长的光,而是通过对每个通道使用稍微不同的波长(颜色)的光来同时发送多个信号。波分复用过程创建许多并行虚拟光纤,每个都能够携带不同的信号。 光学发射机和接收器被调谐为只发送和检测特定的波长。组合后的光通过一根光纤发送。如果WDM可用于增加已安装光纤的容量,则这一点特别有吸引力。 基于光带宽的分离,波分复用被细化为过程和密集版本。通道波分多路复用( CW DM)可以在一根光纤上封装18个信道,而密集波分多路复用(DWDM)可以在一根光纤上提供多达90个同步信道。 对增加信息传输的持续追求促使设计师采取下一步,利用DWDM和相干光学技术。与传统的振幅调制,如PAM2或PAM4传输单一数据流不同,相干检测不仅可以调制光的振幅,还可以调制光的相位和偏振特性来提高光纤的数据传输能力。 使用集成的相干接收器和数字信号处理器(D SP )芯片来恢复光信号的强度、相位和偏振,该芯片可以重建原始信号特性来恢复数据位。 正交调幅器(QAM、8QAM或16QAM)提高了对现有光纤基础设施的利用率,并降低了网络成本。相干传输也提供了比直接检测更高的灵敏度,可能减少了距离高达120公里的信道功率需求。 相干光传输的使用并非没有挑战。更高的比特率需要更复杂的调制方案,使符号更紧密地放在一起,使它们对噪声更敏感。解决方案是使用集成在DSP中的强FEC(正向误差校正),这可以增加电力和热量预算。目前缺乏一个统一的组织来确保竞争产品之间的互操作性,这也是一个问题。 在过去,相干光学只有在极长的洲际和海底连接中才体现成本效益。硅光子封装的最新进展和7nm DSPs的发展使制造包括DSP、激光、放大器光电探测器和射频 集成电路 的模块成为可能,大大降低了成本,并使相干光学集成到行业标准可插拔 连接器 中。 线路卡正在被低功耗的CFP2、QSFP-DD和OSFP相干可插拔收发器所取代。更高功率的长距离相干收发器也可作为嵌入式pcb安装模块,并可提供高达800Gb/s。 下一代设备设计者要求连贯的可插拔设备,提供远程诊断、自动可调性和更高的发射能力来优化他们的网络。 将DWDM与相干调制相结合,将光网络路线图从100G扩展到800G及更高。在这一点上,利用Open ROADM、400ZR、Open ZR+和Open XR等行业举措的连贯插入设备正在汇聚到400G上,这可能在未来5到10年主导光网络。使用400ZR的连贯QSFP-DD和OSFP可插拔设备,目前可提供高达400 Gb/s的80个通道,总容量为32 Tb/s。 数据中心正在从100G发展到400G,最终达到800+ Gb网络,覆盖范围可达1000+公里。实现这种转变的一个关键技术是相干可插拔和嵌入式相干收发器。QSFP-DD800配置文件中的几个800G可插拔设备已经被宣布用于早期客户评估。 人们对相干光学的兴趣并不局限于数据中心。有线电视运营商正在寻找使用光纤,从集线器到聚合节点的点对点相干链路都利用光纤的优点。随着组件价格的持续下降,相干技术将应用到更短的地铁和边缘应用中,成本是主要考虑因素。 持续的组件集成推动了将400G相干光传输技术直接集成到路由器或交换机中的 趋势 ,从而降低了网络的复杂性和组件数量。信息论中的一个基本原理是香农极限(Shannon Limit),它定义了可以在受噪声影响的信道上传输的无错误数据的最大速率。对更快的波特率、更高的网络容量和最大化范围传输将继续通过优化光纤来实现,使性能尽可能接近香农极限。 ~相干光学在以前只有在极长的洲际和海底连接中才体现出成本效益。最近,提高数据传输速度、延长通道长度和增加系统容量方案得到新的发展,使得设计者更容易采用这类解决方案。 买电子元器件现货上唯样商城 高性能计算和电信设备的设计者,以及互联网服务提供商,一直在寻找提高数据传输速度、扩展信道长度、增加系统容量、优化信号保真度和降低功耗的方法。这一探索导致了更多采用光纤连接。 在其最简单的形式中,光信道由一个组件完成,它将信息转换为一系列表示1或0的二进制光脉冲。非归零(NRZ)PAM2调制多年来一直是光数据通道的主导地位。 这种形式光通信被称为直接检测(direct detect ),并已成为电信和数据中心光互连中的主要通信链路。 像这样的简单链接对于单个数据流是理想的,但是数据中心和电信网络需要尽可能高效地将大文件高速传输。 安装更多光纤来扩大容量是一种有效但代价昂贵的解决方案。并行多极光纤可增加总信道带宽,但体积也增加了。光纤电缆可能包含1到3000多根光纤,这对于大型数据中心的电缆托盘提出挑战。获得许可证、通行权的使用权和安装新的外部光缆所需的成本和时间,使得寻求通过每根现有光纤传输尽可能多的数据势在必行。 数据信道的容量可以通过几种方式来增加,例如增加每秒传输的符号数或信号变化,或增加每个符号传输的比特数。增加每秒数据量需要增加频率,这可到导致信号完整性问题,并限制了链路的有效范围。 直接检测光信令的性能可以通过使用先进的振幅调制方案来提高。在给定的波特率下,通过加倍比特率来提高每个时钟周期效率的能力使得PAM4调制被广泛采用。 PAM4信令已成为在铜通道和光纤通道中实现56+Gb数据速率的首选机制。标准组织和MSA组织,包括OIF、PCIe、InfiniBand和Ethernet,已经在最新规范中采用PAM4调制。 在许多数据中心,使用直接检测技术的单个光纤传输带宽已经开始达到实际极限。为了进一步支持高速和高容量的连接性需求,已经开发出了先进的光纤。 替代传统单核光纤的一种方法是引入多核光纤(MCF),它在一根光纤中集成了多个并行光纤。 多芯光纤允许在同一包层下通过不同的芯同时传输不同信号。其结果是增加了每个光纤的数据传输密度。 多核光纤制造和终端方面的进步使其成为传统单芯光纤更经济可行的替代方案。 包括中空芯光纤的光纤结构正在发展,比如,用空气填充毛细管取代标准玻璃芯。由于光在空气中传播速度快50%,这种独特的光纤是正在寻找极低信号延迟应用的理想方案。 提高各光纤的光谱效率已成为提高光信道数据容量的一个重点。波分多路复用(WDM)已被证明是一种高效的解决方案。而不是通过光纤发送单一波长的光,而是通过对每个通道使用稍微不同的波长(颜色)的光来同时发送多个信号。波分复用过程创建许多并行虚拟光纤,每个都能够携带不同的信号。 光学发射机和接收器被调谐为只发送和检测特定的波长。组合后的光通过一根光纤发送。如果WDM可用于增加已安装光纤的容量,则这一点特别有吸引力。 基于光带宽的分离,波分复用被细化为过程和密集版本。通道波分多路复用(CWDM)可以在一根光纤上封装18个信道,而密集波分多路复用(DWDM)可以在一根光纤上提供多达90个同步信道。 对增加信息传输的持续追求促使设计师采取下一步,利用DWDM和相干光学技术。与传统的振幅调制,如PAM2或PAM4传输单一数据流不同,相干检测不仅可以调制光的振幅,还可以调制光的相位和偏振特性来提高光纤的数据传输能力。 使用集成的相干接收器和数字信号处理器(DSP)芯片来恢复光信号的强度、相位和偏振,该芯片可以重建原始信号特性来恢复数据位。 正交调幅器(QAM、8QAM或16QAM)提高了对现有光纤基础设施的利用率,并降低了网络成本。相干传输也提供了比直接检测更高的灵敏度,可能减少了距离高达120公里的信道功率需求。 相干光传输的使用并非没有挑战。更高的比特率需要更复杂的调制方案,使符号更紧密地放在一起,使它们对噪声更敏感。解决方案是使用集成在DSP中的强FEC(正向误差校正),这可以增加电力和热量预算。目前缺乏一个统一的组织来确保竞争产品之间的互操作性,这也是一个问题。 在过去,相干光学只有在极长的洲际和海底连接中才体现成本效益。硅光子封装的最新进展和7nm DSPs的发展使制造包括DSP、激光、放大器光电探测器和射频集成电路的模块成为可能,大大降低了成本,并使相干光学集成到行业标准可插拔连接器中。 线路卡正在被低功耗的CFP2、QSFP-DD和OSFP相干可插拔收发器所取代。更高功率的长距离相干收发器也可作为嵌入式pcb安装模块,并可提供高达800Gb/s。 下一代设备设计者要求连贯的可插拔设备,提供远程诊断、自动可调性和更高的发射能力来优化他们的网络。 将DWDM与相干调制相结合,将光网络路线图从100G扩展到800G及更高。在这一点上,利用Open ROADM、400ZR、Open ZR+和Open XR等行业举措的连贯插入设备正在汇聚到400G上,这可能在未来5到10年主导光网络。使用400ZR的连贯QSFP-DD和OSFP可插拔设备,目前可提供高达400 Gb/s的80个通道,总容量为32 Tb/s。 数据中心正在从100G发展到400G,最终达到800+ Gb网络,覆盖范围可达1000+公里。实现这种转变的一个关键技术是相干可插拔和嵌入式相干收发器。QSFP-DD800配置文件中的几个800G可插拔设备已经被宣布用于早期客户评估。 人们对相干光学的兴趣并不局限于数据中心。有线电视运营商正在寻找使用光纤,从集线器到聚合节点的点对点相干链路都利用光纤的优点。随着组件价格的持续下降,相干技术将应用到更短的地铁和边缘应用中,成本是主要考虑因素。 持续的组件集成推动了将400G相干光传输技术直接集成到路由器或交换机中的趋势,从而降低了网络的复杂性和组件数量。信息论中的一个基本原理是香农极限(Shannon Limit),它定义了可以在受噪声影响的信道上传输的无错误数据的最大速率。对更快的波特率、更高的网络容量和最大化范围传输将继续通过优化光纤来实现,使性能尽可能接近香农极限。 来源:《国际线缆与连接》投稿人 冯文飞编译 作者:Robert Hult
  • 热度 3
    2022-12-12 15:07
    501 次阅读|
    0 个评论
    连接器是数据通信设备中央电源架的重要组成部分。在为数据通信设备选择连接器时,需要评估几个关键因素,如尺寸、功率、电源效率、电流和温升,并且考虑到数据通信设备的每个中央机架中大约有50个连接器,连接器的成本也是一个关键问题。本文康瑞连接器厂家主要为大家讲解数据通信连接器实现成本节约的方法! 为数据通信应用选择合适的连接器可以在许多方面节省成本。一种方法是减少每个机架中的连接器数量,这可以通过将电源和信号组合在一个连接器中来实现。 另一种方法是选择能够以最高效率提供最高性能的连接器。然而,选择正确的连接器是棘手的,因为廉价的连接器通常效率低下,并且可能存在一些危险的问题。虽然降低了成本,但是从长远来看,便宜的连接器会消耗更多的电。在连接器的使用寿命期间,这种能量消耗和相关的增加的冷却成本很容易使连接器的价格增加几倍。 此外,就每个数据通信设备机架的投资而言,连接器的价格可能非常昂贵,连接器供应商提供的测试数据可以实现很好的解决方案,设计出高效的连接器,降低运营成本。然而,使用高效连接器来实现成本节约是其中的一部分。先进的高导电性材料可用于连接器引脚,以提供更高的功效。连接器触针的初始接触电阻越低,效率越高。 东莞市康瑞电子有限公司,是一家20多年专业从事连接器、连接线、电子线束等连接器生产厂家,主要产品有连接器、排针排母、接插件、连接线、线束、电子线、线对板连接器、线对线连接器等。公司各种资质证书齐全,技术力量雄厚,加工设备精良,检验设备完善以及拥有极强的研发能力,为您提供绿色环保高质量连接器及线束,是您最忠实可靠的合作伙伴。可联系我们konnra.cn
  • 热度 14
    2015-11-20 22:15
    1984 次阅读|
    0 个评论
    随着智能手机的普遍,手机的功能变得越来越强大,在我们的日常生活中所扮演的角色也越来越重要,小到我们日常的饮食起居,大到工业、商业管理。我们可以回想一下自己手机是否已经代替了我们之前的闹钟,手机是否开始胚盘我们一起运动,手机是否可以实时查看一些我们的财经信息。这些答案都是肯定的,手机的智能化逐渐使得我们之前的很多工作都可以在移动中完成,不再受地域的限制,在接下来的内容中, 风云物联网科技 将手机与物联网结合起来,实现手机通过蓝牙与ZigBee无线传感网数据的通信。 本系统主要是通过手机通过蓝牙与蓝牙模块进行无线连接,蓝牙模块在通过穿行接口与ZigBee协调器链接,蓝牙主要充当一个无线中继,他的作用就是串口透传,整个系统主要由手机终端、蓝牙透传模块、ZigBee无线传感网三大部分组成,其中最核心的部分就是ZigBee无线传感网络这里不对ZigBee终端节点传感器驱动编程进行详细介绍,有需要了解的可以参考 风云物联网科技 倾力打造的 ZigBee开发教程 (打开网盘链接可以直接下载),这里着重对协调器与路由器的串口透传进行原理分析,并对源码进行解析。在具体的工程项目中我们可以根据自己的需要对数据进行相应格式的封装,下面通过一个简单例子和源码说明ZigBee串口透传的实现。 具体的实验原理为:首先由协调器建立网络,中断节点自动加入到该网络,加入成功后终端节点周期性的向协调器发送字符串“HLO I AM EndDevice”协调器接收到该字符串后,通过串口发送给手机,同时协调器通过无线回应终端节点发送字符串“HLO”给终端节点,具体通讯结构框图如图5-31所示: 图5-31通讯结构框图 串口数据的无线传输协调器和终端节点程序流程图如图5-32a和5-32b所示:                           5-32a协调器程序流程图                        5-32b中断节点程序流程图 在ZigBee的无线数据传输网络中有三种设备类型:协调器、路由器和终端节点,设备类型是由ZigBee协议栈中的不同选项决定,协调器负责网络的组建,维护以及终端节点的加入等任务。路由器负责数据包的路由选择,终端节点则负责数据的采集与无线发送。 以上程序实现了单个ZigBee开发板与电脑的串口通信,接下来我们实现两个开发板之间无线传输并将传输的无线数据通过串口发送到电脑。 接下来我们对实现源码进行分析: 协调器端源码: #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h"   #include "GenericApp.h" #include "DebugTrace.h"   #if !defined( WIN32 )   #include "OnBoard.h" #endif   /* HAL */ #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h"   /* RTOS */ #if defined( IAR_ARMCM3_LM ) #include "RTOS_App.h" #endif     /*********************************************************************  * MACROS  */   /*********************************************************************  * CONSTANTS  */   /*********************************************************************  * TYPEDEFS  */   /*********************************************************************  * GLOBAL VARIABLES  */ // This list should be filled with Application specific Cluster IDs. const cId_t GenericApp_ClusterList  = {   GENERICAPP_CLUSTERID };   const SimpleDescriptionFormat_t GenericApp_SimpleDesc = {   GENERICAPP_ENDPOINT,              //  int Endpoint;   GENERICAPP_PROFID,                //  uint16 AppProfId ;   GENERICAPP_DEVICEID,              //  uint16 AppDeviceId ;   GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;   GENERICAPP_FLAGS,                 //  int   AppFlags:4;   GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;   0,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList; };   endPointDesc_t GenericApp_epDesc;   byte GenericApp_TaskID;   // Task ID for internal task/event processing                           // This variable will be received when                           // GenericApp_Init() is called. devStates_t GenericApp_NwkState;   byte GenericApp_TransID;  // This is the unique message ID (counter)   afAddrType_t GenericApp_DstAddr; const SimpleDescriptionFormat_t GenericApp_SimpleDesc = {   GENERICAPP_ENDPOINT,              //  int Endpoint;   GENERICAPP_PROFID,                //  uint16 AppProfId ;   GENERICAPP_DEVICEID,              //  uint16 AppDeviceId ;   GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;   GENERICAPP_FLAGS,                 //  int   AppFlags:4;   GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;   0,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList; }; static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); static void GenericApp_SendTheMessage( void ); static void rxCallBack(uint8 port,uint8 event); void GenericApp_Init( uint8 task_id ) {   halUARTCfg_t uartConfig;    //定义串口配置结构体变量   GenericApp_TaskID = task_id;   GenericApp_TransID = 0;     // Device hardware initialization can be added here or in main() (Zmain.c).   // If the hardware is application specific - add it here.   // If the hardware is other parts of the device add it in main()     // Fill out the endpoint description.   GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;   GenericApp_epDesc.task_id = GenericApp_TaskID;   GenericApp_epDesc.simpleDesc             = (SimpleDescriptionFormat_t *)GenericApp_SimpleDesc;   GenericApp_epDesc.latencyReq = noLatencyReqs;     // Register the endpoint description with the AF   afRegister( GenericApp_epDesc );   uartConfig.configured    =  TRUE;    uartConfig.baudRate     =  HAL_UART_BR_115200;  //串口传输波特率设置为115200   uartConfig.flowControl   =  FALSE;//串口流控选择关闭   uartConfig.callBackFunc  =  NULL;//无需回调函数   HalUARTOpen(0,uartConfig);//打开串口 } 需要注意的是,在串口配置部分,回调函数不需要了,所以设置为“NULL"即可。 uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ) {   afIncomingMSGPacket_t *MSGpkt;   if ( events  SYS_EVENT_MSG )   {     MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );     while ( MSGpkt )     {       switch ( MSGpkt-hdr.event )       {         case AF_INCOMING_MSG_CMD:           SampleApp_MessageMSGCB( MSGpkt );           break;         default:           break;       }       osal_msg_deallocate( (uint8 *)MSGpkt );       // Next - if one is available       MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );     }     // return unprocessed events     return (events ^ SYS_EVENT_MSG);   }   return 0; } 上述代码是消息处理函数,该函数大部分代码是固定的,不需要读者修改,只需要熟悉这种格式即可,唯一需要读者修改的代码是GenericApp_MessageMSGCB()函数,读者可以修改该函数的实现形式,但是其功能基本都是完成对接收数据的处理。 当协调器收到终端节点发送来的数据后,首先使用osal_msg_receive()函数,从消息队列接收到消息,然后调用GenericApp_MessageMSGCB()函数,因此,需要从 GenericApp_MessageMSGCB()函数中将接收到数据通过串口发送给PC机。 void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt) { unsigned char buffer ; Switch(pkt-clusterId) { case GENERICAPP_CLUSTERID: osal_memcpy(buffer,pkt-cmd.Data,10); HalUARTWrite(0,buffer,10); Break; } } 使用osal_memcpy()函数,将接收到的数据拷贝到buffer数组中,然后就可以将该数据通过串口发送给PC机。pkt-cmd.data是存放接收数据的首地址。 终端节点源码: 因为终端节点加入网络后,需要周期性的向协调器发送数据,怎么实现周期性的发送数据呢?这里需要使用到ZigBee协议栈里面的一个定时器函数osal_start_timerEx(),该函数可以实现毫秒级的定时,定时时间到达后发送数据到协调器,发送完数据后,定时器清零,如此周期性的循环发送就可以实现周期定时的数据发送。 uint8 osal_start_timerEx()函数原形如下: uint8 osal_start_timerEx( uint8 taskID, uint16 event_id, uint16 timeout_value ) {   halIntState_t intState;   osalTimerRec_t *newTimer;   HAL_ENTER_CRITICAL_SECTION( intState );  // Hold off interrupts.   // Add timer   newTimer = osalAddTimer( taskID, event_id, timeout_value );   HAL_EXIT_CRITICAL_SECTION( intState );   // Re-enable interrupts.   return ( (newTimer != NULL) ? SUCCESS : NO_TIMER_AVAIL ); } 在以上函数中有三个参数: taskID——该参数表明定时时间到达后,那个任务对其作出响应; event_id——该参数表明的是一个事件ID,表明定时间到达后,该事件发生,因此需要添加一个新的事件,该事件发生则表明定时时间到达,因此可以在该事件的事件处理函数中实现数据发送; timeout_value——定时时间由timeout_value(以毫秒为单位)参数确定。 添加新事件的方法是:在Enddevice.c文件中添加如下宏定义。 #define SEND_DATA_EVENT 0x01 这样就添加了一个新事件SEND_DATA_EVENT,该事件的ID是0x01。 这时,就可以使用osal_start_timeEx()函数设置定时器,如果要实现1秒的定时,将参数timeout_value设置为1000。 使用如下函数源码可以实现对事件的处理: if(eventsSEND_DATA_EVENT) { GenericApp_SendTheMessage(); osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,1000); return(events^SEND_DATA_EVENT); } 如果事件SEND_DATA_EVENT发生,则eventsSEND_DATA_EVENT非零,事件成立则实行GenericApp_SendTheMessage()函数,向协调器发送数据,发送完数据后再定时1s,同时清除SEND_DATA_EVENT事件,可以利用语句 events^SEND_DATA_EVENT 定时时间到达后,循环上述的处理就可以实现周期性的发送数据。 则Enddevice.c源代码如下: #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h"   #include "GenericApp.h" #include "DebugTrace.h"   #if !defined( WIN32 )   #include "OnBoard.h" #endif   /* HAL */ #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h"   /* RTOS */ #if defined( IAR_ARMCM3_LM ) #include "RTOS_App.h" #endif     #define SEND_DATA_EVENT 0x01       //添加新事件   // This list should be filled with Application specific Cluster IDs. const cId_t GenericApp_ClusterList  = {   GENERICAPP_CLUSTERID };   const SimpleDescriptionFormat_t GenericApp_SimpleDesc = {   GENERICAPP_ENDPOINT,              //  int Endpoint;   GENERICAPP_PROFID,                //  uint16 AppProfId ;   GENERICAPP_DEVICEID,              //  uint16 AppDeviceId ;   GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;   GENERICAPP_FLAGS,                 //  int   AppFlags:4;   GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;   0,          //  byte  AppNumInClusters;   (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList; };/*初始化端口描述*/   endPointDesc_t GenericApp_epDesc;   byte GenericApp_TaskID;   // Task ID for internal task/event processing                           // This variable will be received when                           // GenericApp_Init() is called. devStates_t GenericApp_NwkState;   byte GenericApp_TransID;  // This is the unique message ID (counter)   afAddrType_t GenericApp_DstAddr;   unsigned char uartbuf ;   static void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); static void GenericApp_SendTheMessage( void ); static void rxCallBack(uint8 port,uint8 event); void GenericApp_Init( uint8 task_id ) {   halUARTCfg_t uartConfig;   GenericApp_TaskID = task_id;   GenericApp_TransID = 0;     GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT;   GenericApp_epDesc.task_id = GenericApp_TaskID;   GenericApp_epDesc.simpleDesc             = (SimpleDescriptionFormat_t *)GenericApp_SimpleDesc;   GenericApp_epDesc.latencyReq = noLatencyReqs;     // Register the endpoint description with the AF   afRegister( GenericApp_epDesc );   uartConfig.configured    =  TRUE;   uartConfig.baudRate      =  HAL_UART_BR_115200;   uartConfig.flowControl   =  FALSE;   uartConfig.callBackFunc  =  NULL;//串口回调函数不需要,所以将函数指针设置为NULL   HalUARTOpen(0,uartConfig); } uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events ) {   afIncomingMSGPacket_t *MSGpkt;   if(eventsSYS_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_event(GenericApp_TaskID,SEND_DATA_EVENT);           }         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);     return(events^SEND_DATA_EVENT);   }   return 0; } 当终端节点加入网络之后使用osal_set_event()函数设置SEND_DATA_EVENT事件, osal_set_event()函数原形如下: uint8 osal_set_event( uint8 task_id, uint16 event_flag ) {   if ( task_id  tasksCnt )   {     halIntState_t   intState;     HAL_ENTER_CRITICAL_SECTION(intState);    // Hold off interrupts     tasksEvents  |= event_flag;  // Stuff the event bit(s)     HAL_EXIT_CRITICAL_SECTION(intState);     // Release interrupts     return ( SUCCESS );   }    else   {     return ( INVALID_TASK );   } } 使用该函数可以设置事件,事件发生后将预先定义的事件值赋给任务为task_id的event_flag参数。   if(events^SEND_DATA_EVENT)   {     GenericApp_SendTheMessage();     osal_start_timerEx(GenericApp_TaskID,SEND_DATA_EVENT,1000);     return(events^SEND_DATA_EVENT);   } 以上函数是对事件的处理,设置好定时时间间隔,定时周期性的向协调器发送数据。 /*在数据发送函数中,发送“HLO I AM EndDevice”到协调器,因为协调器的网络地址是0x0000,所以直接调用数据发送函数AF_DataRequest()即可,在该函数的参数中需要确定发送的目的地址、发送模式(单播、广播还是多播)以及目的端口号信息。*/ void GenericApp_SendTheMessage(void) {   unsigned char theMessageData ="HLO";   afAddrType_t my_DstAddr;   my_DstAddr.addrMode=(afAddrMode_t)Addr16Bit;//单播发送   my_DstAddr.endPoint=GENERICAPP_ENDPOINT;//目的端口号   my_DstAddr.addr.shortAddr=0x0000;//协调器网络地址   AF_DataRequest(my_DstAddr,                  GenericApp_epDesc,                  GENERICAPP_CLUSTERID,                  osal_strlen("HLO")+1,                  theMessageData,                  GenericApp_TransID,                  AF_DISCV_ROUTE,                  AF_DEFAULT_RADIUS                  ); } 需要注意的是:osal_strlen()函数返回字符串的实际长度,osal_strlen()函数源码如下: int osal_strlen( char *pString ) {   return (int)( strlen( pString ) ); } 在发送数据时,需要将字符串的结尾字符一起发送,所以需要将该返回值加1才是实际需要发送的字符数目,即osal_strlen(“HLO I AM EndDevice”)+1; 5.5.4实验现象 将以上程序源码编译完成之后下载到CC2530开发板中进行在线调试,调试界面如图5-36和图5-37所示: 图5-36协调器端数据接收测试图 图5-37终端节点端串口数据接收测试图 从测试效果可以看出,终端节点和协调器每隔1s会收到一次握手数据,终端节点成功加入网络后每隔1s向协调器发送一串“HLO I AM EndDevice”,当协调器收到终端节点的握手数据会向终端节点发送回应字符“HLO”,测试效果与预期相符。
  • 热度 16
    2013-4-26 14:57
    1337 次阅读|
    0 个评论
    摘要: 以DSPTMS320F28335为核心设计了数据通信及处理模块。该模块采用硬件协议栈芯片W5300实现与上位机的TCP/IP通信,同时利用双口RAM实现与电控系统主控板的数据通信,与主控板通信的实时性由同步时钟触发外部中断的方式实现。根据误差补偿算法,该模块可实现对激光跟踪测量系统所测量的大气参数、激光干涉测距、激光绝对测距、方位角和俯仰角信息的误差补偿。   作者:章文娟,王中宇,周维虎,王亚伟 作者单位:  北京航空航天大学仪器科学与光电工程学院 中国科学院光电研究院 论文链接: http://d.wanfangdata.com.cn/Periodical_wxjyyy201117018.aspx 来自万方数据知识服务平台   更多信息与我们交流: WIZnet邮箱: wiznetbj@wiznettechnology.com WIZnet中文博客:        http://www.iwiznet.cn/ WIZnet官方主页:        http://www.iwiznet.cn/ WIZnet企业官方微博: http://e.weibo.com/wiznet2012
  • 热度 19
    2013-4-26 14:55
    826 次阅读|
    0 个评论
    摘要: 以DSPTMS320F28335为核心设计了数据通信及处理模块。该模块采用硬件协议栈芯片W5300实现与上位机的TCP/IP通信,同时利用双口RAM实现与电控系统主控板的数据通信,与主控板通信的实时性由同步时钟触发外部中断的方式实现。根据误差补偿算法,该模块可实现对激光跟踪测量系统所测量的大气参数、激光干涉测距、激光绝对测距、方位角和俯仰角信息的误差补偿。   作者:章文娟,王中宇,周维虎,王亚伟 作者单位:  北京航空航天大学仪器科学与光电工程学院 中国科学院光电研究院 论文链接: http://d.wanfangdata.com.cn/Periodical_wxjyyy201117018.aspx 来自万方数据知识服务平台   更多信息与我们交流: WIZnet邮箱: wiznetbj@wiznettechnology.com WIZnet中文博客:        http://www.iwiznet.cn/ WIZnet官方主页:        http://www.iwiznet.cn/ WIZnet企业官方微博: http://e.weibo.com/wiznet2012
相关资源