实验5--点对点无线通讯实验

合集下载

无线传感网——zigbee基础实验-点对点通信

无线传感网——zigbee基础实验-点对点通信

⽆线传感⽹——zigbee基础实验-点对点通信 //头⽂件1 #include <iocc2530.h>23 #include "hal_mcu.h"4 #include "hal_assert.h"5 #include "hal_board.h"6 #include "hal_rf.h"78 #include <stdio.h>9 #include "basic_rf.h"1011#define NODE_TYPE 012#define RF_CHANNEL 251314#define PAN_ID 0x200715#define SEND_ADDR 0x253016#define RECV_ADDR 0x25201718static basicRfCfg_t basicRfConfig;先将NODE_TYPE改为1(发送),然后可找⼀个标识为Status的盒⼦编译烧写此程序(断电)再将NODE_TYPE改为0(接收),然后可找⼀个标识为Data的盒⼦编译烧写此程序RF数据发送函数void rfSendData(void){uint8 pTxData[] = {"你好,我是发送端CC2530过来的数据!\r\n\r\n"};uint8 ret;printf("send node start up...\r\n");basicRfReceiveOff();while(TRUE){ret = basicRfSendPacket(RECV_ADDR, pTxData, sizeof pTxData);if (ret == SUCCESS){hal_led_on(1);halMcuWaitMs(100);hal_led_off(1);halMcuWaitMs(900);}else{hal_led_on(1);halMcuWaitMs(1000);hal_led_off(1);}}} RF数据接收函数 1void rfRecvData(void)2 {3 uint8 pRxData[128];4int rlen;567 printf("recv node start up...\r\n");89 basicRfReceiveOn();1011while(TRUE)12 {13while(!basicRfPacketIsReady());14 rlen = basicRfReceive(pRxData, sizeof pRxData, NULL);15if(rlen > 0)16 {17 printf((char *)pRxData);18 }19 }20 }主函数void main(){halMcuInit(); //MCU初始化hal_led_init(); //LED初始化hal_uart_init(); //Uart初始化if(FAILED == halRfInit()) //CC2530-RF 初始化{HAL_ASSERT(FALSE);}basicRfConfig.panId = PAN_ID;basicRfConfig.channel = RF_CHANNEL;basicRfConfig.ackRequest = TRUE;#if NODE_TYPEbasicRfConfig.myAddr = SEND_ADDR; //(0x2530)#elsebasicRfConfig.myAddr = RECV_ADDR; //(0x2520)#endifif(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}#if NODE_TYPErfSendData();#elserfRecvData();#endif}再将刚才烧写好的发送盒⼦拼接到接收盒⼦上开串⼝调试器后(两根线都连接收盒)进⾏跟踪结果如下:(接收盒⼦不断有数据过来)"你好,我是发送端CC2530过来的数据!"。

长距离点对点(PtP)WiFi无线系统传输方案设计

长距离点对点(PtP)WiFi无线系统传输方案设计

33Km点对点(PtP)WiFi无线系统传输测试报告V2 壹、测试目的测试33Km远距离WiFi无线传输的真实流量与天线调整技术的精进练习,并同时测试1W与50mw传输能力比较。

现场测试人员:阿树、阿南。

远程调整测试人员:jmj10101。

貳、测试地点与测试距离台湾苗栗县通霄镇 台湾台中县台中港南端,总距离33.29Km。

2008年11月16日台湾苗栗县通霄镇高度: 约海拔72公尺台湾台中县台中港南端高度: 约海拔70公尺陸、测试系统无线设备规画--台湾台中县台中港南端— NB1 192.168.1.33Device: M500AG System Mode: Bridge IP: 192.168.1.2 Interface: RF1Operation Mode: AC (Client)ESSID: pczonetest Band: 802.11g (only)Channel: 13RF Output Power: 50mW = 17dBmLimit Rate: 54Mbps Multicast Rate: 11Mbps Max RF Distance: 350Command Line: rateadaption 0 13 rateadaption 1 3 --台湾苗栗县通霄镇— PC1 192.168.1.20Device: M600AG System Mode: Bridge IP: 192.168.1.1Interface: RF1 (RF2 Disable)Operation Mode: AP ESSID: pczonetest Band: 802.11g (only)Channel: 13RF Output Power: 50mW = 17dBmLimit Rate: 54Mbps Multicast Rate: 11Mbps Max RF Distance: 350Command Line: rateadaption 0 13 rateadaption 1 3柒、33Km无线系统透过Ixchariot测试Throughput状况Summary - untitled1.tstRun OptionsTest Setup (Console to Endpoint 1)Test Setup (Endpoint 1 to Endpoint 2)Test Execution (Endpoint 1 to Endpoint 2)ThroughputTransaction RateResponse TimeEndpoint ConfigurationRaw Data Totals5. 总结测试统计测试迅雷Download速度,透过33Km Internet PtP无线系统传输状况33Km WiFi PtP Internet Throughput: 1.15MB/s ( 1.15 MB/s * 8 = 9.2 Mbps )捌、50mW VS 1000mW = 1W 测试比较1.测试完成后,在天线保持原来状况下(水平极化),AP换成Argtek产品WLAN 11g Router module (1W) with High Powe r2.设定画面如下:3.以迅雷测试下载速度33Km WiFi PtP Internet Throughput: 12.92KB/s ( 12.92 KB/s * 8 = 103.36 Kbps )。

简单无线收发实验

简单无线收发实验

简单无线收发实验简单无线收发实验实现个域网内任意两个用户之间的信息交换。

网关或端节点收到的无线信道送过来的数据后,比较PANID和网络段地址,PANID和短地址与本地相符时,将数据通过串口或其他方式传送到用户终端,否则将数据丢掉,不送到用户终端。

点对点通信时,只有1个用户可以接受信息点对点连接的两个系统或进程之间的专用通信链路。

想象一下直接连接两个系统的一条线路。

两个系统独占此线路进行通信。

点对点通信对的对里面是广播,一个系统可以向多个系统传输。

本实验我们采用一个网关节点和一个路由节点进行简单数据无线收发实验。

当路由节点被允许加入网络后,网关节点将记录下此路由节点的网络短地址,当网关接收到无线数据后,将数据通过串口送出:当路由节点需要想网关节点发送数据时,即通过无线信道发送到网络短地址0x0000,同样,网关节点接收到数据后,也通过串口送出。

实际上我们可以通过网络短地址Zigbee的个域网中实现任意两个节点之间的点对点无线收发实验简单无线收发实验实现个域网内任意两个用户之间的信息交换。

网关或端节点收到的无线信道送过来的数据后,比较PANID和网络段地址,PANID和短地址与本地相符时,将数据通过串口或其他方式传送到用户终端,否则将数据丢掉,不送到用户终端。

点对点通信时,只有1个用户可以接受信息点对点连接的两个系统或进程之间的专用通信链路。

想象一下直接连接两个系统的一条线路。

两个系统独占此线路进行通信。

点对点通信对的对里面是广播,一个系统可以向多个系统传输。

Zigbee 是一个高可靠的无线数传网络,类似于CDMA和GSM 网络。

Zigbee 数传模块类似于移动网络基站。

通讯距离从标准的75m到几百米、几公里,并且支持无限扩展。

Zigbee是一个由可多到65000个无线数传模块组成的一个无线数传网络平台,在整个网络范围内,每一个Zigbee 网络数传模块之间可以相互通信,每个网络节点间的距离可以从标准的75m无限扩展。

点对点通信实验步骤2017

点对点通信实验步骤2017

基于CAsyncSocket类的点对点通信客户机创建流程●通信流程:1.服务器点击“监听”按钮开始监听,实现Create和Listen函数2.客户机点击“连接”按钮进行连接,实现Connect函数3.服务器端接受连接,并触发onAccept事件,实现函数Aeecpt4.客户端或者服务器端点击“发送”按钮,发送文本框的数据5.服务器端或者客户端接收数据,OnReveive事件被触发,实现函数Receive6.客户端或者服务器端点击“断开”,执行函数close,触发另一端的onClose事件自定义类获取对话框指针的方法1.先在CMyDialog.cpp中声明一个全局变量CMyDialog* pDlg;2在OnInitDialog()初始化的时候,pDlg = this;3.在自定义类使用的时候,在自定义的类的Cpp中添加extern CMyDialog* pDlg;4.在自定类中使用pDlg->yourfunction();●编程过程:客户端:1、创建MFC应用程序,勾选windows socket选项,如创建工程名为client,自动创建类CClientAPP和CClientDlg,并生成相应的源文件(.cpp)和头文件(.h)。

APP代表应用程序。

Dlg代表对话框2、布置界面如下图所示3、建立类向导,给文本编辑框,列表框定义变量名及类型4、插入基于CAsyncSocket的类,如取名clientsock,确定后类视图下右键单击类并载入虚函数onReceive(),onClose(),如果是服务器端还要加载onAccept5、程序的各个类之间建立联系,具体步骤:5.1对话框界面与套接字建立连接。

在ClientDlg.h文件中将“clientsock.h”文件包含进来,使其能够访问套接字,代码为#include”clientsocket.h”;并添加成员变量m_clientsock,代码clientsock m_clientsock;5.2套接字与对话框界面建立联系。

[方案]实验5点对点协议PPP

[方案]实验5点对点协议PPP

实验5 点对点协议PPP(一)原理介绍:PPP 提供了一种在点对点的链路上封装多协议数据报(IP 、IPX和AppleTalk)的标准方法。

它不仅能支持IP地址的动态分配和管理;同步(面向位的同步数据块的传送)或异步(起始位+数据位+奇偶校验位+停止位)物理层的传输;网络层协议的复用;链路的配置、质量检测和纠错;而且还支持多种配置参数选项的协商。

PPP协议主要包括三部分:LCP(Link Control Protocol)链路控制协议、NCP(Network Control Protocol)和PPP的扩展协议(如Multilink Protocol)(二)实验背景:R大学和F大学分别相聚数百公里,两个学校的电脑通过路由器和外网连接,现在要在链路层上实现两路由器的连接,并且能够进行相互认证和出错检验。

(三)实验目的:掌握PPP协议的基本原理掌握PPP协议的基本配置分别使用PAP与CHAP验证配置PPP(四)实验拓扑图:注:在实际连线中RT1的S1/0与RT2的S1/0已在机柜背部连接,不用再手工连接。

(五)实验设备:H3C MSR 20-40 两台PC 机两台(六)实验命令:表1 配置本地以PAP方式验证对端表2 配置本地以CHAP方式验证对端表3 配置本地被对端以PAP方式验证表4 配置本地被对端以CHAP方式验证rip部分的命令请看rip实验的手册(七)实验具体操作:1、使用PAP验证配置RT1RT22、使用CHAP验证配置RT1RT2(八)实验结果察看:1、使用PAP验证配置[RT1]dis ip routing-table[RT1]dis cur从PCd PING PCa:从PCb TRACERT PCa:从PCa PING PCd:2、使用CHAP验证配置[RT1]display ip routing-table[RT1]dis cur[RT2]display ip routing-table[RT2]dis cur注:。

点对点通信

点对点通信

17 点对点无线通信实验1.实验目的培养开发CC2420射频驱动的能力。

2.实验设备硬件:PC机(二台)教学开发平台(二套)软件:Keil串口调试工具3.实验内容PC通过串口工具在发送节点A端输入想要发送的数据,点击发送,在接收节点B端PC上的串口工具上,可以看到节点B收到的内容。

如要发送10个字节内容为11 22 33 44 55 66 77 88 99 AA的数据/时,在发送节点A端的串口工具上输入0A 11 22 33 44 55 66 77 88 99 AA,其中0A代表要发送数据的长度,以16进制表示。

在接收节点B端的串口工具上就可以收到相应的数据。

注:本实验发送和接收的数据方式是十六进制,并且发送的长度的范围[5,127],具体规定可以参见标准。

4.实验预习要求仔细阅读CC2420手册。

5.实验步骤(1)启动Keil µVision3,建立一个工程;(2)编写程序代码;(3)编译程序并生成可执行文件;(4)分别对节点A和节点B下载程序,将开发平台和计算机通过串口线连接起来;(5)分别运行节点A和节点B的程序;(6)在节点A端的串口工具上输入0A 11 22 33 44 55 66 77 88 99 AA,点击发送;在节点B端的串口工具上能接收到A点发送的数据;(1)~(5)步骤的详细过程请参考第一、二小节进行操作。

6.实验参考程序(1)main.h参考程序#ifndef MAIN_H#define MAIN_H#define REG_BIT_DEF sbit#define GLOBAL_ISR_DISABLE() (EA = 0)#define GLOBAL_ISR_ENABLE() (EA = 1)#define EXT_DATA xdata#define LED P2#define UART0_BR_1152 243 //243 + 13(13.292) 117788(实测 117647 bit/8.5us) #define ISR_PRIORITY_HIGH 1#define ISR_PRIORITY_LOW 0typedef bit BOOL;typedef unsigned char BYTE; //8 bittypedef unsigned int WORD; //16 bittypedef unsigned long DWORD; //32 bittypedef unsigned char Bool;REG_BIT_DEF LED1 = 0xA0; // P2^0;#define SET_LED(x) (LED##x = 0)#define CLR_LED(x) (LED##x = 1)REG_BIT_DEF CCRESET = 0x96; // P1^6;REG_BIT_DEF CCVREGEN = 0x97; // P1^7;REG_BIT_DEF FIFOP = 0x92; // P1^2;REG_BIT_DEF FIFO = 0x94; // P1^4;REG_BIT_DEF SFD = 0x90; // P1^0;REG_BIT_DEF CCA = 0x95; // P1^5;#define SFD_IS_ACTIVE() SFD // SFD bit is set #define FIFO_IS_ACTIVE() FIFO // FIFO bit is set #define CCA_IS_ACTIVE() CCA // CCA bit is set #define FIFOP_IS_ACTIVE() !FIFOP// Command strobes#define CC2420_SNOP 0x00#define CC2420_SXOSCON 0x01#define CC2420_STXCAL 0x02#define CC2420_SRXON 0x03#define CC2420_STXON 0x04#define CC2420_STXONCCA 0x05#define CC2420_SRFOFF 0x06#define CC2420_SXOSCOFF 0x07#define CC2420_SFLUSHRX 0x08#define CC2420_SFLUSHTX 0x09#define CC2420_SACK 0x0A#define CC2420_SACKPEND 0x0B// Registers#define CC2420_MAIN 0x10#define CC2420_MDMCTRL0 0x11#define CC2420_MDMCTRL1 0x12#define CC2420_RSSI 0x13#define CC2420_SYNCWORD 0x14#define CC2420_TXCTRL 0x15#define CC2420_RXCTRL0 0x16#define CC2420_RXCTRL1 0x17#define CC2420_FSCTRL 0x18#define CC2420_SECCTRL0 0x19#define CC2420_SECCTRL1 0x1A#define CC2420_BATTMON 0x1B#define CC2420_IOCFG0 0x1C#define CC2420_IOCFG1 0x1D#define CC2420_MANFIDL 0x1E#define CC2420_MANFIDH 0x1F#define CC2420_FSMTC 0x20#define CC2420_MANAND 0x21#define CC2420_MANOR 0x22#define CC2420_AGCCTRL 0x23#define CC2420_AGCTST0 0x24#define CC2420_AGCTST1 0x25#define CC2420_AGCTST2 0x26#define CC2420_FSTST0 0x27#define CC2420_FSTST1 0x28#define CC2420_FSTST2 0x29#define CC2420_FSTST3 0x2A#define CC2420_RXBPFTST 0x2B#define CC2420_FSMSTATE 0x2C#define CC2420_ADCTST 0x2D#define CC2420_DACTST 0x2E#define CC2420_TOPTST 0x2F#define CC2420_RESERVED 0x30// FIFOs#define CC2420_TXFIFO 0x3E#define CC2420_RXFIFO 0x3F// Memory// Sizes#define CC2420_RAM_SIZE 368#define CC2420_FIFO_SIZE 128// Addresses#define CC2420_RAM_TXFIFO 0x000#define CC2420_RAM_RXFIFO 0x080#define CC2420_RAM_IEEEADDR 0x160#define CC2420_RAM_PANID 0x168#define CC2420_RAM_SHORTADDR 0x16A#define CC2420_CRC_OK 0x80#define GLOBAL_ISR_CTRL_REG() (EA)#define NSS_LOW() (NSSMD0=0)#define PHY_24G_CHANNEL_MAX 26 // MAX channel number for 2.4G channel #define PHY_24G_CHANNEL_MIN 11 // MIN channel number for 2.4G channel #define PHY_24G_CHANNEL_PAGE 0#define MAX_CHAN_NUM (PHY_24G_CHANNEL_MAX -PHY_24G_CHANNEL_MIN + 1)#define PHY_POWER_LEV_MAX 31 // MAX power level#define PHY_POWER_LEV_MIN 3 // MIN power level#define SYSTEM_CLK 24500000#define SPI0_CLK 5000000#define SPI0CKR_V ALUE (SYSTEM_CLK /2 /SPI0_CLK -1)#define NSS_LOW() (NSSMD0=0)#define NSS_HIGH() (NSSMD0=1)#define APP_TO_MAC_BUF_MAX_NUM 2#define APP_TO_MAC_BUF_MAX_SIZE 198#define MAC_TO_APP_BUF_MAX_NUM 2#define MAC_TO_APP_BUF_MAX_SIZE 128#define PHY_TO_MAC_BUF_MAX_NUM 1#define PHY_TO_MAC_BUF_MAX_SIZE 128#define UART0_TIMEOUT_1152 140 //us#define TIMER0_RELOAD(x) (65536 - (SYSTEM_CLK /12) *(x) /1000000)#define UART0_TIMEOUT(BR) TIMER0_RELOAD((115200 /BR) *UART0_TIMEOUT_1152) #define aMaxPHYPacketSize 127 // The maximum PSDU size (in octets) the PHY shall be able to receive.#define aMinPHYPacketSize 5 // The minimal PSDU size (in octets) the PHY shall be able to receive.typedef struct tag_PHY_PIB{BYTE phyCurrentChannel; // The RF channel number. 0 ~ 26DWORD phyChannelsSupported; // b27 ~ b31 channel page supported,BYTE phyTransmitPower; // 0x00 ~ 0xbf represent 31 ~ -32dBmBYTE phyCCAMode; // 1 ~ 3BYTE phyCurrentPage; // 0 ~ 31WORD phyMaxFrameDuration; // The maximum number of symbols in a frame.BYTE phySHRDuration; // The duration of the synchronization header (SHR) BYTE phySymbolsPerOctet; // The number of symbols per octet for the current BYTE SelfUartBaudrate;}tPhyPib;typedef enum{DEVICE_IDLE = 0,DATA_IN_TRANSMIT,DATA_TRANSMIT_COMPLETE,ERR_DATA_IN_TRANSMIT}eUartState;typedef struct tag_UAR_TRX_MANAGE_MESSAGE{BYTE TxLen;eUartState TxStatus;BYTE TxIndex;BYTE *TxDataFirstAddr;BYTE RxLen;BYTE *RxDataFirstAddr;}tUartTRxManaMsg;typedef enum{BUF_EMPTY = 0,BUF_FULL,BUF_NORMAL}eBufState;typedef struct tag_BUF_MANAGE_MESSAGE{BYTE EXT_DATA *Buf;BYTE EXT_DATA *Len;MaxSize;BYTEBYTEMaxNum;WriteIndex;BYTEReadIndex;BYTEStatus;eBufState}tBufManaMsg;typedef enum tag_UART_BAUDRATE{BR_115200 = 0x01,BR_57600,BR_38400,BR_19200,BR_9600}eUartBaudRate;typedef struct tag_MAC_TX_BUF{BYTE Buf[aMaxPHYPacketSize];BYTE Length;}tMacTxBuf;typedef union tag_WORD_BYTE{WORD W;struct {BYTE H;BYTE L;}B;}uWord;static BYTE EXT_DATAgPhyToMacBuf[PHY_TO_MAC_BUF_MAX_NUM][PHY_TO_MAC_BUF_MAX_SIZE]; static BYTE EXT_DATA gPhyToMacSonBufDataLen[PHY_TO_MAC_BUF_MAX_NUM]; tBufManaMsg EXT_DATA gPhyToMacBufMana;tPhyPib EXT_DATA gPhyPib; // phy PIB datastatic BYTE EXT_DATAgAppToMacBuf[APP_TO_MAC_BUF_MAX_NUM][APP_TO_MAC_BUF_MAX_SIZE]; static BYTE EXT_DATA gAppToMacSonBufDataLen[APP_TO_MAC_BUF_MAX_NUM]; static BYTE EXT_DATAgMacToAppBuf[MAC_TO_APP_BUF_MAX_NUM][MAC_TO_APP_BUF_MAX_SIZE]; static BYTE EXT_DATA gMacToAppSonBufDataLen[MAC_TO_APP_BUF_MAX_NUM]; static tBufManaMsg EXT_DATA gAppToMacBufMana;static tBufManaMsg EXT_DATA gMacToAppBufMana;static tUartTRxManaMsg EXT_DATA gUartTRxManaMsg;tMacTxBuf EXT_DATA gMacTxBuf;#ifndef TRUE#define TRUE 1#endif#ifndef FALSE#define FALSE 0#endif#ifndef NULL#define NULL ((void*)0)#endif#endif(2)main.c参考程序#include <C8051F120.H>#include <intrins.h>#include "main.h"////////////////////////////////////////////////////////////////////////////名称:WTDDisable()//功能:关闭看门狗//////////////////////////////////////////////////////////////////////////void WTDDisable(void){GLOBAL_ISR_DISABLE(); //writing to 0xDE and 0xAD must be finished in 4 clock cyclesWDTCN = 0xDE;WDTCN = 0xAD;GLOBAL_ISR_ENABLE();}////////////////////////////////////////////////////////////////////////////名称:SystemClkInit()//功能:系统时钟初始化//////////////////////////////////////////////////////////////////////////void SystemClkInit(void){WORD EXT_DATA tmp;SFRPAGE = CONFIG_PAGE;OSCXCN = 0x67; // enable ext osc 10-30MHz rangefor (tmp=24500; tmp!=0; tmp--) // Wait 1ms for initialization{;}while ((OSCXCN & 0x80) == 0){;}OSCICN = 0x83; // Enable 24.5 MHz internal oscfor (tmp=24500; tmp!=0; tmp--) // Wait 1ms for initialization{;}while ((OSCICN & 0x40) == 0){;}CLKSEL = 0x00; // Select internal clock source}////////////////////////////////////////////////////////////////////////////名称:SfrAutoSwithDis()//功能:SFR自动页切换关闭//////////////////////////////////////////////////////////////////////////void SfrAutoSwitchDis(void){SFRPAGE = CONFIG_PAGE;SFRPGCN = 0x00;}////////////////////////////////////////////////////////////////////////////名称:PortInit()//功能:端口初始化//////////////////////////////////////////////////////////////////////////void PortInit(void){SFRPAGE = CONFIG_PAGE; // SFR page switchingXBR0 |= 0x04; // enable UARTP0MDOUT |= 0x01; // enable TX as a push-pull output XBR0 |= 0x02; // Enable SPIP0MDOUT |= 0x34; // SCK,MOSI,NSS push-pull output XBR0 |= 0x01; // enable smbus (skip 2 pins) XBR0 |= 0x10; // enable CEX0 = P1.0,CEX1 = P1.1 XBR1 |= 0x04; // enable /int0 = P1.2P1MDOUT |= 0xC0; // RESET VRGEN push-pull output XBR2 |= 0x40; // Enable Crossbar}////////////////////////////////////////////////////////////////////////////名称:Uart0Init()//功能:UART0初始化//入口参数:优先级//////////////////////////////////////////////////////////////////////////void Uart0Init(BOOL pri){1;ES0=if(pri){IP0x10;|=}else{IP &= 0xEF;}SFRPAGE = UART0_PAGE; //Config UART0 registerSCON0 = 0x50; //Mode1(8 bit data),No check stop bit,Enable receiveSSTA0 = 0x10; //Baud rate doubler enable,T1溢出率为TX和RX的时钟源SFRPAGE = TIMER01_PAGE; //Config timer1 registerTCON = 0x00;TMOD = 0x20; //T1 timer mode uses 8 bit overloadCKCON = 0x10; //T1 timer is used for system clockTR1 = 0;}////////////////////////////////////////////////////////////////////////////名称:Uart0TimeOutTimerInit()//功能:This function initializes the UART timer (Timer0).//入口参数:优先级//////////////////////////////////////////////////////////////////////////void Uart0TimeOutTimerInit(BOOL pri){=pri; //定时器0中断优先级控制PT0=TIMER01_PAGE;SFRPAGETMOD |= 0x01; //16 bitTF0 = 0;TR0 = 0; //Turn off timer0}void Uart0TimeOutTimerTurnOff(void){BYTE saveSfr = SFRPAGE;TIMER01_PAGE;SFRPAGE=TR0 = 0; // stop timer countTF0 = 0; //clear isr flagET0 = 0; // Turn off isr0;TH0=TL0 = 0;SFRPAGE = saveSfr;}////////////////////////////////////////////////////////////////////////////名称:Spi0Init()//功能:SPI设置//////////////////////////////////////////////////////////////////////////void Spi0Init(void){SFRPAGE = SPI0_PAGE; // SFR page switchingSPI0CFG = 0x40; // master mode, + clock, 1st edgeSPI0CN = 0x0C; // 4 wire NSS highSPI0CKR = SPI0CKR_V ALUE; // init SPI clockSPI0CN |= 0x01; // enable SPISFRPAGE = 0x0F; // disable spi interruptEIE1 &=0xF6;}////////////////////////////////////////////////////////////////////////////名称:ExternalISRInit()//功能:外部中断设置//////////////////////////////////////////////////////////////////////////void ExternalISRInit(BOOL pri){SFRPAGE = TIMER01_PAGE;TCON |= 0x01; // low level triggeredTCON &= ~0x02; // clear IE0 flagIE |= 0x01; // Enable INT0if(pri){IP |= 0x01;}else{IP &= 0xFE;}}////////////////////////////////////////////////////////////////////////////名称:Uart0SetBaudrate()//功能:UART0波特率设置//入口参数:波特率//////////////////////////////////////////////////////////////////////////void Uart0SetBaudrate(BYTE baudrate){TIMER01_PAGE;SFRPAGE=TR1 = 0; //Turn off T1baudrate;TH1=TL1 = baudrate;TR1 = 1; //Turn on T1}////////////////////////////////////////////////////////////////////////////名称:XdataMemset()//功能:This function sets the first length bytes in buffer to value//入口参数:// p: buffer point to set.// value: byte value to set// len: buffer length to set//////////////////////////////////////////////////////////////////////////void XdataMemset(void EXT_DATA *p, BYTE value, WORD EXT_DATA len) reentrant{ BYTE EXT_DATA *byteP;if(len == 0){return;}byteP = (BYTE EXT_DATA *)p;while(len--){value;=*byteP++}}////////////////////////////////////////////////////////////////////////////名称:UartTRxManaMsgInit()//功能:Initialize Uart0 trx data control structure//////////////////////////////////////////////////////////////////////////void UartTRxManaMsgInit(void){XdataMemset(&gUartTRxManaMsg, 0, sizeof(gUartTRxManaMsg));NULL;=gUartTRxManaMsg.TxDataFirstAddrNULL;gUartTRxManaMsg.RxDataFirstAddr=}////////////////////////////////////////////////////////////////////////////名称:BufBetweenAppAndMacInit()//功能:This function initialize the buffer information between App and Mac//////////////////////////////////////////////////////////////////////////void BufBetweenAppAndMacInit(void){XdataMemset(&gAppToMacBuf, 0, sizeof(gAppToMacBuf));0,sizeof(gAppToMacSonBufDataLen)); XdataMemset(&gAppToMacSonBufDataLen,XdataMemset(&gMacToAppBuf, 0, sizeof(gMacToAppBuf));0,sizeof(gMacToAppSonBufDataLen)); XdataMemset(&gMacToAppSonBufDataLen,gAppToMacBufMana.Buf = &gAppToMacBuf[0][0];gAppToMacSonBufDataLen;gAppToMacBufMana.Len=APP_TO_MAC_BUF_MAX_SIZE;=gAppToMacBufMana.MaxSizegAppToMacBufMana.MaxNum = APP_TO_MAC_BUF_MAX_NUM;=0;gAppToMacBufMana.WriteIndex0;=gAppToMacBufMana.ReadIndexBUF_EMPTY;gAppToMacBufMana.Status=gMacToAppBufMana.Buf = &gMacToAppBuf[0][0];gMacToAppSonBufDataLen;=gMacToAppBufMana.LenMAC_TO_APP_BUF_MAX_SIZE;gMacToAppBufMana.MaxSize=gMacToAppBufMana.MaxNum = MAC_TO_APP_BUF_MAX_NUM;gMacToAppBufMana.WriteIndex0;=0;gMacToAppBufMana.ReadIndex==BUF_EMPTY;gMacToAppBufMana.Status}////////////////////////////////////////////////////////////////////////////名称:PhyPibInit()//功能:This procedure will do a initialization on globle PHY PIB database//////////////////////////////////////////////////////////////////////////void PhyPibInit(void){gPhyPib.phyCurrentChannel = 11; // channel 11gPhyPib.phyCurrentPage = PHY_24G_CHANNEL_PAGE; // current page is 0gPhyPib.phyChannelsSupported = 0x07FFF800;gPhyPib.phyTransmitPower = 31; // 0x00 ~ 0xbf represent 31 ~ -32dBmgPhyPib.phyCCAMode = 2; // carrier sense onlygPhyPib.phyMaxFrameDuration = 266; // the maximum number of symbols gPhyPib.phySHRDuration = 10; // the duration of the sync header is 3, 7, 10, 40 gPhyPib.phySymbolsPerOctet = 2; // the number of symbols per octet gPhyPib.SelfUartBaudrate = BR_115200; //BR_38400;}////////////////////////////////////////////////////////////////////////////名称:Delay1us()//功能:延时1us//入口参数:延时的时间//////////////////////////////////////////////////////////////////////////void Delay1us(WORD EXT_DATA time){while(time--){_nop_();_nop_(); _nop_(); _nop_(); _nop_();_nop_();_nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); _nop_();_nop_(); _nop_(); _nop_(); _nop_();}}////////////////////////////////////////////////////////////////////////////名称:CC2420Strobe()//功能:This function sends a strobe command byte out of the SPI to the CC2420//入口参数:CC2420 command//出口参数:CC2420 status register value//////////////////////////////////////////////////////////////////////////BYTE CC2420Strobe(BYTE strobe){BYTEEaSave;0x0F){if(strobe>CC2420_SNOP;strobe=}EaSave = GLOBAL_ISR_CTRL_REG();GLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW(); // force NSS low,start cc2420 spiSPIF = 0; // clear SPI0 interrupt tagSPI0DAT = strobe;while(!SPIF){ ;} // Wait until finishedstrobe = SPI0DAT; // read Recv'd data.SPIF = 0; // clear interrupt flagNSS_HIGH(); // force NSS high,stop cc2420 spiGLOBAL_ISR_CTRL_REG() = EaSave;strobe;return}////////////////////////////////////////////////////////////////////////////名称:CC2420StatusRead()//功能:This function sends a NOP command and returns the CC2420's status value//出口参数:CC2420 status register value//////////////////////////////////////////////////////////////////////////BYTE CC2420StatusRead(void){BYTE value;EaSave;BYTEEaSave = GLOBAL_ISR_CTRL_REG();GLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW(); // force NSS low,Csn=0,cc2420 spi workSPIF = 0;SPI0DAT = CC2420_SNOP;while(!SPIF){ ;} // Wait until finishedvalue = SPI0DAT; // read Recv'd data.SPIF = 0; // clear interrupt flagNSS_HIGH(); // force NSS highGLOBAL_ISR_CTRL_REG() = EaSave;value;return}////////////////////////////////////////////////////////////////////////////名称:CC2420SetReg()//功能:This function is used to set the value of the CC2420 registers//入口参数:add:CC2420 register address;value: register value to set//////////////////////////////////////////////////////////////////////////void CC2420SetReg(BYTE add,WORD value){BYTE EaSave;if((add > 0x0F) && (add < 0x30)){=GLOBAL_ISR_CTRL_REG();EaSaveGLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW(); // force NSS low,start cc2420 spiSPIF = 0; // clear SPI0 interrupt tagSPI0DAT = add; // Send addresswhile(!SPIF){ ;}ACC = SPI0DAT;SPIF = 0;SPI0DAT = (BYTE)(value >> 8); // Send value high 8 bitswhile(!SPIF){ ;}ACC = SPI0DAT;SPIF = 0;SPI0DAT = (BYTE)value; // Send value low 8 bitswhile(!SPIF){ ;}ACC = SPI0DAT;SPIF = 0;NSS_HIGH(); // force NSS high,stop cc2420 spi GLOBAL_ISR_CTRL_REG()EaSave;=}}////////////////////////////////////////////////////////////////////////////名称:CC2420GetReg()//功能:This function is used to read the value of the CC2420 registers//入口参数:add: CC2420 register address//出口参数:the CC2420 register value//////////////////////////////////////////////////////////////////////////WORD CC2420GetReg(BYTE add){BYTE EaSave;value;WORDif((add > 0x0F) && (add < 0x30)){add |= 0x40; // set bit 6=GLOBAL_ISR_CTRL_REG();EaSaveGLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW();SPIF = 0;SPI0DAT = add; // Send addresswhile(!SPIF){ ;}ACC = SPI0DAT;SPIF = 0;SPI0DAT = 0x00; // Get register high 8 bitswhile(!SPIF){ ;}value = SPI0DAT << 8;SPIF = 0;SPI0DAT = (BYTE)value; // Get register low 8 bitswhile(!SPIF){ ;}value += SPI0DAT;SPIF = 0;NSS_HIGH();=EaSave;GLOBAL_ISR_CTRL_REG()value;return}}////////////////////////////////////////////////////////////////////////////名称:PhySetTxPower()//功能:This procedure will set current transmit power to a new specified level//入口参数:chan: channel number;txPower: transmit power//出口参数:state: To report the result of setting a new transmit power//////////////////////////////////////////////////////////////////////////BYTE PhySetTxPower(BYTE phyPower){i;BYTEWORD EXT_DATA rRegVal, wRegVal;if (phyPower > PHY_POWER_LEV_MAX || phyPower < PHY_POWER_LEV_MIN){i = 0;i;return}rRegVal = CC2420GetReg(CC2420_TXCTRL);wRegVal = (rRegVal & 0xFFE0) + phyPower;CC2420SetReg(CC2420_TXCTRL, wRegVal);1;i=i;return}////////////////////////////////////////////////////////////////////////////名称:PhySetCurrentChannel()//功能:This procedure will set current channel to a new specified channel//入口参数:phyChannel: The new channel number//出口参数:state: To report the result of setting a new channel//////////////////////////////////////////////////////////////////////////BYTE PhySetCurrentChannel(BYTE phyChannel){i;BYTEWORD EXT_DATA rRegVal, wRegVal;if(phyChannel < PHY_24G_CHANNEL_MIN || phyChannel >PHY_24G_CHANNEL_MAX){i = 0;i;return}// read current channel's register valueCC2420GetReg(CC2420_FSCTRL);=rRegVal// calculate the new channel's register value, lock_thr number use 1wRegVal = 357 + 5*(phyChannel - 11) + 0x40000;// check if the current channel is the channel we want to setif((rRegVal & 0x3FF) == (wRegVal & 0x3FF)){i = 1;i;return}wRegVal = wRegVal + (rRegVal & 0xFC00); // save the old register valueCC2420Strobe(CC2420_SRFOFF); // turn off the RFCC2420SetReg(CC2420_FSCTRL, wRegVal); // set the new channel's register value CC2420Strobe(CC2420_SRXON); // turn on the RF and set to RX_ONi1;=i;return}////////////////////////////////////////////////////////////////////////////名称:CC2420Init()//功能:This is the 2420 initialization procedure//入口参数:chan: channel number;txPower: transmit power//////////////////////////////////////////////////////////////////////////void CC2420Init(BYTE chan, BYTE txPower){CCRESET = 0; // reset CC2420CCVREGEN = 1; // enable regulatorDelay1us(64700); // delay for stablizationCCRESET = 1; // resetCC2420Strobe(CC2420_SXOSCON); // turn on CC2420 Osc Delay1us(4700); // delay 4.7mswhile ((CC2420StatusRead() & 0x40) == 0){ // wait for osc stable bit ;}CC2420Strobe(CC2420_SFLUSHRX); // flush cc2420's rx fifoCC2420Strobe(CC2420_SFLUSHTX); // flush cc2420's tx fifoCC2420SetReg(CC2420_IOCFG0,0x027F); //Setting FIFOP to 127 bytes active low CC2420SetReg(CC2420_TXCTRL,0x80FF);PhySetTxPower(txPower); //Change Send PowerPhySetCurrentChannel(chan); //set current channelCC2420SetReg(CC2420_MDMCTRL0,0x02E2); // set CC2420,crc en,cca mode is 3,autoack disable,addr recognition disable */CC2420SetReg(CC2420_RSSI,0xEC80); //-20 (0xEA80 -22)CC2420SetReg(CC2420_MDMCTRL1, 0x0500);CC2420Strobe(CC2420_SRXON);}////////////////////////////////////////////////////////////////////////////名称:PhyToMacBufInit()//功能:This function initialize the buffer information of Phy to Mac//////////////////////////////////////////////////////////////////////////void PhyToMacBufInit(void){XdataMemset(&gPhyToMacBuf, 0, sizeof(gPhyToMacBuf));sizeof(gPhyToMacSonBufDataLen));0,XdataMemset(&gPhyToMacSonBufDataLen,gPhyToMacBufMana.Buf = &gPhyToMacBuf[0][0];gPhyToMacSonBufDataLen;=gPhyToMacBufMana.LenPHY_TO_MAC_BUF_MAX_SIZE;=gPhyToMacBufMana.MaxSizegPhyToMacBufMana.MaxNum = PHY_TO_MAC_BUF_MAX_NUM;0;=gPhyToMacBufMana.WriteIndex=0;gPhyToMacBufMana.ReadIndexBUF_EMPTY;gPhyToMacBufMana.Status=}////////////////////////////////////////////////////////////////////////////名称:ReadGetBufData()//功能:This function is used to retrive the data address of RX buffer//入口参数:bufManaMsg and len//////////////////////////////////////////////////////////////////////////BYTE *ReadGetBufData(tBufManaMsg * bufManaMsg, BYTE *len){if(bufManaMsg->StatusBUF_EMPTY){!=NULL){if(len!=bufManaMsg->Len[bufManaMsg->ReadIndex];*len=}return (&bufManaMsg->Buf[bufManaMsg->ReadIndex * bufManaMsg->MaxSize]); }else{NULL;return}}////////////////////////////////////////////////////////////////////////////名称:SonBufWriteRelease()//功能:This function releases a son data buffer//入口参数:bufManaMsg//////////////////////////////////////////////////////////////////////////void SonBufWriteRelease(tBufManaMsg * bufManaMsg){bufManaMsg->WriteIndex++;if(bufManaMsg->WriteIndex == bufManaMsg->MaxNum){0;=bufManaMsg->WriteIndex}if(bufManaMsg->WriteIndex == bufManaMsg->ReadIndex){BUF_FULL;=bufManaMsg->Status}else{bufManaMsg->Status = BUF_NORMAL;bufManaMsg->Len[bufManaMsg->WriteIndex]0;=}}////////////////////////////////////////////////////////////////////////////名称:SonBufReadRelease()//功能:This function releases a son data buffer//入口参数:bufManaMsg//////////////////////////////////////////////////////////////////////////void SonBufReadRelease(tBufManaMsg * bufManaMsg){bufManaMsg->Len[bufManaMsg->ReadIndex] = 0;bufManaMsg->ReadIndex++;if(bufManaMsg->ReadIndex == bufManaMsg->MaxNum){0;=bufManaMsg->ReadIndex}== bufManaMsg->WriteIndex){if(bufManaMsg->ReadIndex=BUF_EMPTY;bufManaMsg->Status}else{bufManaMsg->Status = BUF_NORMAL;}}////////////////////////////////////////////////////////////////////////////名称:XdataToXdataMemcpy()//功能:This function copys length(len) bytes from source(src) buffer to destination(dest) buffer //入口参数:dest: destination buffer point// src: source buffer point// len: maximum bytes to copy//////////////////////////////////////////////////////////////////////////void XdataToXdataMemcpy(void EXT_DATA *dest, void EXT_DATA *src, WORD EXT_DATA len) reentrant{BYTE EXT_DATA *destP;BYTE EXT_DATA *srcP;if(len == 0){return;}destP = (BYTE EXT_DATA *)dest;srcP = (BYTE EXT_DATA *)src;while(len--){*srcP++;*destP++=}}////////////////////////////////////////////////////////////////////////////名称:CC2420WriteFIFOByte()//功能:This function writes a byte to the FIFO//入口参数:value:one byte data//////////////////////////////////////////////////////////////////////////void CC2420WriteFIFOByte(BYTE value){BYTEEaSave;EaSave = GLOBAL_ISR_CTRL_REG();GLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW();SPIF = 0; // clear SPIFSPI0DAT = CC2420_TXFIFO;while(!SPIF){ ;}ACC = SPI0DAT;SPIF = 0;SPI0DAT = value;;}while(!SPIF){ACC = SPI0DAT;SPIF = 0;NSS_HIGH();GLOBAL_ISR_CTRL_REG() = EaSave;}////////////////////////////////////////////////////////////////////////////名称:CC2420WriteFIFO()//功能:This function writes a number of bytes to the FIFO for RF transmission//入口参数:*point: Tx buffer data point; len : the data length to Tx //////////////////////////////////////////////////////////////////////////BOOL CC2420WriteFIFO(BYTE *pData, BYTE len){EaSave;BYTEif(len > 128 || len == 0){FALSE;return}EaSave = GLOBAL_ISR_CTRL_REG();GLOBAL_ISR_DISABLE();SFRPAGE = SPI0_PAGE;NSS_LOW();SPIF = 0; // clear SPIFSPI0DAT = CC2420_TXFIFO;while(!SPIF){ ;}ACC = SPI0DAT;while(len--){GLOBAL_ISR_DISABLE();0;=SPIF*pData++;=SPI0DATwhile(!SPIF){ ;}=SPI0DAT;ACCGLOBAL_ISR_ENABLE();}SPIF = 0;NSS_HIGH();GLOBAL_ISR_CTRL_REG() = EaSave;TRUE;return}////////////////////////////////////////////////////////////////////////////名称:GetBufStatus()//功能:This function is used to get status//入口参数:bufManaMsg//出口参数:status//////////////////////////////////////////////////////////////////////////eBufState GetBufStatus(tBufManaMsg * bufManaMsg){(bufManaMsg->Status);return}////////////////////////////////////////////////////////////////////////////名称:WriteGetBufLenAddr()//功能:This function is used to get buffer length address//入口参数:bufManaMsg//出口参数:len//////////////////////////////////////////////////////////////////////////BYTE *WriteGetBufLenAddr(tBufManaMsg * bufManaMsg){return(&bufManaMsg->Len[bufManaMsg->WriteIndex]);}////////////////////////////////////////////////////////////////////////////名称:UartTxByte()//功能:This function is used to send one byte data//入口参数:value:one byte data//////////////////////////////////////////////////////////////////////////void UartTxByte(BYTE value){BYTE SfrSave = SFRPAGE;SFRPAGE = UART0_PAGE;SBUF0 = value;SFRPAGE = SfrSave;}////////////////////////////////////////////////////////////////////////////名称:AppToMacDataProc()//功能:This function process received app frame from UART//////////////////////////////////////////////////////////////////////////void AppToMacDataProc(void){BYTEfrmLen;*pData;BYTE//get data buffer address.pData = ReadGetBufData(&gAppToMacBufMana, &frmLen);if(pData == NULL){return;}XdataToXdataMemcpy(gMacTxBuf.Buf,pData,frmLen); SonBufReadRelease(&gAppToMacBufMana);CC2420WriteFIFOByte(gMacTxBuf.Buf[0]+2);CC2420WriteFIFO(&gMacTxBuf.Buf[1],frmLen-1);CC2420Strobe(CC2420_STXON);}////////////////////////////////////////////////////////////////////////////名称:PhyToMacDataProc()。

实验5--点对点无线通讯实验

实验5--点对点无线通讯实验

实验题目:实验5--点对点无线通讯实验实验时间:2015.12.2一、实验目的:使用IAR开发环境设计R程序,利用2个CC2530 ZigBee模块实现点对点无线通讯。

二、实验原理及程序分析:a)硬件接口原理ZigBee(CC2530)模块 LED 硬件接口ZigBee(CC2530)模块硬件上设计有 2 个 LED 灯,用来编程调试使用。

分别连接 CC2530 的 P1_0、P1_1两个 IO 引脚。

从原理图上可以看出,2 个 LED 灯共阳极,当 P1_0、P1_1 引脚为低电平时候,LED 灯点亮。

b)关键函数1、射频初始化函数uint8 halRfInit(void)功能描述:zigbee 通信设置,自动应答有效,设置输出功率0dbm,Rx设置,接收中断有效。

参数描述: 无返回:配置成功返回 SUCCESS2、发送数据包函数uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)功能描述:发送包函数。

入口参数:destAddr 目标网络短地址pPayload 发送数据包头指针,length 包的大小出口参数:无返回值:成功返回SUCCESS,失败返回FAILED3、接收数据函数uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)功能描述:从接收缓存中拷贝出最近接收到的包。

参数:接收数据包头指针接收包的大小返回:实际接收的数据字节数c)软件设计void main (void){uint8 i;appState = IDLE; // 初始化应用状态为空闲appStarted = FALSE; // 初始化启动标志位FALSE/* 初始化Basic RF */basicRfConfig.panId = PAN_ID; // 初始化个域网ID basicRfConfig.ackRequest = FALSE; // 不需要确认halBoardInit();if(halRfInit()==FAILED) //初始化hal_rfHAL_ASSERT(FALSE);/* 快速闪烁8次led1,led2 */for(i = 0; i < 16; i++){halLedToggle(1); // 切换led1的亮灭状态halLedToggle(2); // 切换led2的亮灭状态halMcuWaitMs(50); // 延时大约50ms}halLedSet(1); // led1指示灯亮,指示设备已上电运行halLedClear(2);basicRfConfig.channel = 0x0B; // 设置信道#ifdef MODE_SENDappTransmitter(); // 发送器模式#elseappReceiver(); // 接收器模式#endifHAL_ASSERT(FALSE);}void appTransmitter(){uint32 burstSize=0;uint32 pktsSent=0;uint8 appTxPower;uint8 n;/* 初始化Basic RF */basicRfConfig.myAddr = TX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}/* 设置输出功率 *///appTxPower = appSelectOutputPower();halRfSetTxPower(2);//HAL_RF_TXPOWER_4_DBM// halRfSetTxPower(appTxPower);/* 设置进行一次测试所发送的数据包数量 *///burstSize = appSelectBurstSize();burstSize = 100000;/* Basic RF在发送数据包前关闭接收器,在发送完一个数据包后打开接收器*/basicRfReceiveOff();/* 配置定时器和IO *///n= appSelectRate();appConfigTimer(0xC8);//halJoystickInit();/* 初始化数据包载荷 */txPacket.seqNumber = 0;for(n = 0; n < sizeof(txPacket.padding); n++){txPacket.padding[n] = n;}/* 主循环 */while (TRUE){if (pktsSent < burstSize){UINT32_HTON(txPacket.seqNumber); // 改变发送序号的字节顺序basicRfSendPacket(RX_ADDR, (uint8*)&txPacket, PACKET_SIZE);/* 在增加序号前将字节顺序改回为主机顺序 */UINT32_NTOH(txPacket.seqNumber);txPacket.seqNumber++;pktsSent++;appState = IDLE;halLedToggle(1); //切换LED1的亮灭状态halLedToggle(2); //切换LED2的亮灭状态halMcuWaitMs(1000);}/* 复位统计和序号 */pktsSent = 0;}}static void appReceiver(){uint32 segNumber=0; // 数据包序列号int16 perRssiBuf[RSSI_AVG_WINDOW_SIZE] = {0}; // 存储RSSI的环形缓冲uint8 perRssiBufCounter = 0; // 计数器用于RSSI缓冲区统计perRxStats_t rxStats = {0,0,0,0}; // 接收状态int16 rssi;uint8 resetStats=FALSE;int16 MyDate[10]; //串口数据串数字initUART(); // 初始化串口#ifdef INCLUDE_PAuint8 gain;// 选择增益 (仅SK - CC2590/91模块有效)gain =appSelectGain();halRfSetGain(gain);#endif/* 初始化Basic RF */basicRfConfig.myAddr = RX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}basicRfReceiveOn();/* 主循环 */while (TRUE){while(!basicRfPacketIsReady()); // 等待新的数据包if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {halLedSet(1); // 点亮LED1//halLedSet(2); // 点亮LED2UINT32_NTOH(rxPacket.seqNumber); // 改变接收序号的字节顺序segNumber = rxPacket.seqNumber;/* 若果统计被复位,设置期望收到的数据包序号为已经收到的数据包序号*/if(resetStats){rxStats.expectedSeqNum = segNumber;resetStats=FALSE;}rxStats.rssiSum -= perRssiBuf[perRssiBufCounter]; // 从sum中减去旧的RSSI值perRssiBuf[perRssiBufCounter] = rssi; // 存储新的RSSI 值到环形缓冲区,之后它将被加入sumrxStats.rssiSum += perRssiBuf[perRssiBufCounter]; // 增加新的RSSI值到sumMyDate[4] = rssi; ////MyDate[3] = rxStats.rssiSum;////if(++perRssiBufCounter == RSSI_AVG_WINDOW_SIZE){perRssiBufCounter = 0;}/* 检查接收到的数据包是否是所期望收到的数据包 */if(rxStats.expectedSeqNum == segNumber) // 是所期望收到的数据包{MyDate[0] = rxStats.expectedSeqNum;////rxStats.expectedSeqNum++;}else if(rxStats.expectedSeqNum < segNumber) // 不是所期望收到的数据包(收到的数据包的序号大于期望收到的数据包的序号){ // 认为丢包rxStats.lostPkts += segNumber - rxStats.expectedSeqNum;MyDate[2] = rxStats.lostPkts;///rxStats.expectedSeqNum = segNumber + 1;MyDate[0] = rxStats.expectedSeqNum;///}else // 不是所期望收到的数据包(收到的数据包的序号小于期望收到的数据包的序号){ // 认为是一个新的测试开始,复位统计变量rxStats.expectedSeqNum = segNumber + 1;MyDate[0] = rxStats.expectedSeqNum;///rxStats.rcvdPkts = 0;rxStats.lostPkts = 0;}MyDate[1] = rxStats.rcvdPkts;///rxStats.rcvdPkts++;UartTX_Send_String(MyDate,5);halMcuWaitMs(300);halLedClear(1); //熄灭LED1halLedClear(2); //熄灭LED2halMcuWaitMs(300);}}}流程图三、实验步骤及结果:在IAR开发环境中编译、运行、调试程序。

点对点射频通信实验

点对点射频通信实验

3.1 点对点射频通信实验3.1.1 实验目的1、在ZX2530A 型CC2530 节点板上运行相应实验程序。

2、熟悉通过射频通信的基本方法。

3、练习使用状态机实现收发功能。

3.1.2 实验内容接收节点上电后进行初始化,然后通过指令ISRXON 开启射频接收器,等待接收数据,直到正确接收到数据为止,通过串口打印输出。

发送节点上电后和接收节点进行相同的初始化,然后将要发送的数据输出到TXFIFO 中,再调用指令ISTXONCCA 通过射频前端发送数据。

3.1.3 实验设备及工具硬件:ZX2530A 型CC2530 节点板 2 块、USB 接口的仿真器,PC 机Pentium100 以上。

软件:PC 机操作系统WinXP、IAR 集成开发环境、串口监控程序。

3.1.4 实验原理发送节点通过串口接收用户的输入数据然后通过射频模块发送到指定的接收节点,接收节点通过射频模块收到数据后,通过串口发送到pc 在串口调试助手中显示出来。

如果发送节点发送的数据目的地址与接收节点的地址不匹配,接收节点将接收不到数据。

以下为发送节点程序流程图:3.1.5 实验步骤1. 打开光盘“无线射频实验\2.点对点通信”双击p2p.eww 打开本实验工程文件。

2. 打开main.c 文件下面对一些定义进行介绍RF_CHANNEL 此宏定义了无线射频通信时使用的信道,在多个小组同时进行实验是建议每组选择不同时信道。

但同一组实验中两个节点需要保证在同一信道,才能正确通信。

PAN_ID 个域网ID 标示,用来表示不同在网络,在同一实验中,接收和发送节点需要配置为相同的值,否则两个节点将不能正常通信。

SEND_ADDR 发送节点的地址RECV_ADDR 接收节点的地址NODE_TYPE 节点类型:0 接收节点,1:发送节点,在进行实验时一个节点定义为发送节点用来发送数据,一个定义为接收节点用来接收数据。

3. 修改NODE_TYPE 的值为0,并编译下载到节点板。

无线射频点对点 实验报告

无线射频点对点 实验报告

无线射频点对点实验报告1. 引言无线传感器网络(Wireless Sensor Network,简称WSN)在近年来得到了广泛的研究和应用,射频(Radio Frequency,简称RF)通信作为无线传感器网络中最常用的通信方式之一,起着关键的作用。

为了更好地理解和掌握无线射频点对点通信的原理以及性能特点,本实验通过设计搭建一个无线射频点对点通信系统,进行了一系列的实验,探究并评估了其通信性能。

2. 实验目的本实验的目的是通过实践操作,掌握无线射频点对点通信系统的基本原理,了解其工作原理,通过调试和测试,评估其通信性能,并对实验结果进行分析和总结。

3. 实验设备和原理3.1 实验设备本实验使用了以下设备和器材:- 2个射频模块(Transceiver Module)- Arduino开发板(或其他微控制器)- 一台电脑- 连接线和电源适配器3.2 实验原理射频点对点通信系统是通过射频模块实现的,射频模块一般具有收发两个通道,可以实现双向通信。

在该系统中,一个模块作为发送端,另一个作为接收端。

系统的工作原理如下:- 发送数据:发送端将需要发送的数据通过串口或其他方式发送至射频模块,模块将数据进行调制和编码处理,然后通过天线发送出去。

- 接收数据:接收端的射频模块通过天线接收到信号,并进行解调和解码操作,得到发送端发送的数据。

4. 实验步骤按照以下步骤进行实验:1. 按照射频模块的使用说明,将两个射频模块连接到Arduino开发板上,分别作为发送端和接收端。

2. 编写发送端和接收端的程序代码,实现数据的发送和接收功能。

3. 将发送端和接收端的射频模块分别连接到电脑上,调试程序代码,确保发送和接收的功能正常。

4. 安装天线,将发送端和接收端的射频模块通过天线连接起来,确保天线放置位置合适,并且两个射频模块之间没有障碍物。

5. 发送一段测试数据,观察接收端是否能够正确接收到数据,并将结果记录下来。

5. 实验结果与分析经过实验测试,我们成功地搭建了一个无线射频点对点通信系统,并进行了一些简单的通信测试。

北京理工大学-计算机网络实践-WinSock点对点通信实验报告

北京理工大学-计算机网络实践-WinSock点对点通信实验报告
实验一 WinSock 点对点通信程序
一、实验目的:
WinSock 是 Windows 操作系统下的 Socket 编程接口,通过 WinSock 函数库 可以实现基于 TCP/IP 协议的进程之间通信。
理解基于 WinSock 的客户/服务器概念 掌握使用 WinSock 进行编程的方法 了解常见 WinSock 开发模式的使用
SBind();
SAccept(); /* 循环发送请求 */
while(1)
对全部高中资料试卷电气设备,在安装过程中以及安装结束后进行高中资料试卷调整试验;通电检查所有设备高中资料电试力卷保相护互装作置用调与试相技互术关,系电,力根保通据护过生高管产中线工资敷艺料设高试技中卷术资配0料不置试仅技卷可术要以是求解指,决机对吊组电顶在气层进设配行备置继进不电行规保空范护载高高与中中带资资负料料荷试试下卷卷高问总中题体资,配料而置试且时卷可,调保需控障要试各在验类最;管大对路限设习度备题内进到来行位确调。保整在机使管组其路高在敷中正设资常过料工程试况中卷下,安与要全过加,度强并工看且作护尽下关可都于能可管地以路缩正高小常中故工资障作料高;试中对卷资于连料继接试电管卷保口破护处坏进理范行高围整中,核资或对料者定试对值卷某,弯些审扁异核度常与固高校定中对盒资图位料纸置试,.卷保编工护写况层复进防杂行腐设自跨备动接与处地装理线置,弯高尤曲中其半资要径料避标试免高卷错等调误,试高要方中求案资技,料术编试交写5、卷底重电保。要气护管设设装线备备置敷4高、调动设中电试作技资气高,术料课中并中3试、件资且包卷管中料拒含试路调试绝线验敷试卷动槽方设技作、案技术,管以术来架及避等系免多统不项启必方动要式方高,案中为;资解对料决整试高套卷中启突语动然文过停电程机气中。课高因件中此中资,管料电壁试力薄卷高、电中接气资口设料不备试严进卷等行保问调护题试装,工置合作调理并试利且技用进术管行,线过要敷关求设运电技行力术高保。中护线资装缆料置敷试做设卷到原技准则术确:指灵在导活分。。线对对盒于于处调差,试动当过保不程护同中装电高置压中高回资中路料资交试料叉卷试时技卷,术调应问试采题技用,术金作是属为指隔调发板试电进人机行员一隔,变开需压处要器理在组;事在同前发一掌生线握内槽图部内纸故,资障强料时电、,回设需路备要须制进同造行时厂外切家部断出电习具源题高高电中中源资资,料料线试试缆卷卷敷试切设验除完报从毕告而,与采要相用进关高行技中检术资查资料和料试检,卷测并主处且要理了保。解护现装场置设。备高中资料试卷布置情况与有关高中资料试卷电气系统接线等情况,然后根据规范与规程规定,制定设备调试高中资料试卷方案。

点对点无线串口课程设计

点对点无线串口课程设计

点对点无线串口课程设计一、课程目标知识目标:1. 学生理解点对点无线串口通信的基本概念,掌握无线通信的原理和过程;2. 学生掌握点对点无线串口通信模块的选型和使用方法,了解不同模块的性能特点;3. 学生了解并掌握点对点无线串口通信的编程方法,能够进行基本的通信程序编写。

技能目标:1. 学生能够运用所学知识,独立完成点对点无线串口通信系统的搭建;2. 学生具备分析和解决点对点无线串口通信过程中出现问题的能力;3. 学生能够通过实践,提高动手操作和团队协作能力。

情感态度价值观目标:1. 学生培养对无线通信技术浓厚的兴趣,激发学习主动性和创新精神;2. 学生在实践过程中,养成认真负责、严谨细致的工作态度;3. 学生通过团队合作,学会互相尊重、沟通协作,培养集体荣誉感。

课程性质:本课程为信息技术课程,结合学生年级特点,注重理论与实践相结合,以提高学生的动手能力和实际问题解决能力。

学生特点:学生具备一定的电子信息技术基础,对新鲜事物充满好奇,喜欢动手实践,但需引导培养团队合作意识。

教学要求:教师应结合学生特点,采用启发式教学,引导学生主动探究,注重实践操作能力的培养,同时关注学生的情感态度价值观教育。

通过本课程的学习,使学生能够达到上述课程目标,为后续相关课程打下坚实基础。

二、教学内容本课程教学内容主要包括以下三个方面:1. 点对点无线串口通信基本原理:- 无线通信概述:介绍无线通信的发展历程、应用领域和基本原理;- 点对点无线串口通信:讲解点对点通信的原理、通信协议及数据传输方式;- 课本章节:第二章“无线通信基础”。

2. 点对点无线串口通信模块选型与使用:- 常用无线串口模块介绍:分析不同类型无线串口模块的性能、特点及适用场景;- 模块选型与使用:教授如何根据需求选择合适的无线串口模块,并掌握其使用方法;- 课本章节:第三章“无线串口模块及其应用”。

3. 点对点无线串口通信编程与实践:- 编程基础:介绍无线串口通信编程的基本概念、编程语言和开发环境;- 实践项目:设计实际通信项目,指导学生进行通信程序编写和调试;- 课本章节:第四章“无线通信编程与实践”。

atos点对点通信实验报告心得

atos点对点通信实验报告心得

atos点对点通信实验报告心得
5月20日,中国人民在首都北京天安门广场隆重集会,纪念“五四”运动101周年。

当前的实验就是利用一台“创新通信实验平台”进行点对点通信的实验。

本次实验主要内容包括:点对点通讯器、接收机、发射机以及蓝牙、 wifi 等多种无线技术结合起来的移动设备。

该实验所使用的两台接收机可同时连接10个点或100个点。

实验主要分为三步:1、下载、解压、安装与硬件相关的模块;2、调试和编译程序;3、组建实验环境并将蓝牙和 wifi 作为通信工具进行测试。

我们需要注意的是,每一部分都有很大的学问,尤其是第二步——调试和编译程序。

这里面涉及到的知识非常之多,如果没有扎实的基础,那么根本不能完成任务。

而且还必须得熟悉各类软件开发语言,比如 C++、 java、 C#、 Python 等等。

因此,只有掌握了足够的理论知识才能更好地去应付它!
首先,我们需要做的事情便是下载、解压、安装与硬件相关的模块。

这些东西都被封存于一个文件夹中,我们只需双击它即可打开。

这样既方便又快捷,省却了许多麻烦。

然后,我们需要做的便是调试和编译程序。

这也是最难的一项,但只要你耐心细致,认真钻研,总归会找出规律的。

其次,我们需要准备一套完整的蓝牙和 WiFi 通信系统。

- 1 -。

简单无线通信实验

简单无线通信实验

实验四简单无线通信实验一、实验目的学习怎么配置CC2530 RF 功能。

二、实验内容实现两个CC2530 模块进行简单的点到点无线通信。

三、实验设备1.装有IAR 的PC 机一台;2.2530 仿真器,usb 线(A 型转B 型);3.无线节点模块两块,带LCD 的智能主板两块,2.4G 天线两根。

四、程序流程图1、接收模块流程图2、发送模块流程图3、主程序流程图五、实验感想这次实验属于比较综合的实验,它将之前学习到的LED控制、键盘中断与新学的无线传感器RF通信结合到了一起,综合性地考察了我对所学知识的整合能力以及对新知识的接受能力。

在实验中,我学会了如何控制两个无线传感器结点通过basicRF收发数据,了解了RF通信数据帧的格式以及ACK帧的作用,在学习了示例程序的代码之后,我还掌握了读取消息序列号的能力。

虽然最终做出了实验现象,完成了实验任务,但是实验过程中还是遇到了很多问题。

首先,我在测试示例程序时发现按键有时会出现失灵的情况,请教了老师之后明白了其中的原因。

示例程序使用的按键控制是中断模式,也就是按下按键就会改变9554寄存器的值,9554寄存器值改变就会触发中断,然而由于按键抖动以及按下时间不能准确控制的问题,按下一次按键系统往往会做出多次判定,从而认为当前中断服务程序并未跳出,导致下一次按键不再有效。

听取了老师的讲解,更好的方式是采用查询的方式来编写程序,我会在以后的实验中尝试用此方法去编写代码,再观察现象。

其次,我按下按键后显示屏显示的序列号在不停地变化,而不是一个稳定的数值,在对源码进行排查后我发现,我并没有在hal_board.c文件中将SW5键值清零,从而导致系统一直认为SW5在按下并一直不断地发送消息,从而导致收到的序列号不断变化不能稳定。

增加了键值清零的代码后,实验现象恢复正常。

这次实验极大程度地锻炼了我排查问题的能力,我会将其中所学运用到以后的实验过程中去。

实验2 利用点对点通讯实现无线串口

实验2 利用点对点通讯实现无线串口

实验2 利用点对点通讯实现无线串口【实验目的】在实验1建立无线通讯的基础上,实现无线串口通讯。

掌握无线发送和接收数据的方法。

掌握串口接收和发送数据的方法。

【实验内容】配置RF参数;两个CC2530节点建立无线通讯,实现无线串口通讯。

【实验原理】一、Basic RF 参数配置同实验1二、无线数据发送:1. 创建一个buffer,把数据放入其中2. 调用basicRfSendPacket()函数发送三、无线数据接收:1. 通过basicRfPacketIsReady()函数来检查是否收到一个新的数据包。

2. 调用basicRfReceive()函数,把收到的数据复制到buffer中。

四、串口数据发送1. 创建一个buffer,把数据放入其中2. 调用halUartWrite()函数发送五、串口数据接收1. 通过调用RecvUartData()函数来接收数据,并以数据长度来判断是否有收到数据。

六、本例实现功能:一个PC串口连接到一个使用本应用实例的ZigBee设备来收发数据,同样另一个PC串口连接到另一个使用本应用实例的ZigBee设备来收发数据,实现两个串口以无线方式进行双工通讯。

本实验演示了以ZigBee设备来实现串口以无线方式进行双工通讯的方法。

连接如图2-1所示:图2-1 无线串口连接图【实验步骤】1.打开工作空间“...\基于BasciRF的实训\ 2 点对点无线串口实验\Project\ uart_rf.eww”2.参照实验1建立无线通讯的方法,进行参数配置,编译生成两个可建立无线通讯的代码。

分别作以下设置后生成代码:/*****点对点通讯地址设置******/#define RF_CHANNEL 20 // 频道11~26 #define PAN_ID 0x1A5B //网络id #define MY_ADDR 0x1015 // 本机模块地址#define SEND_ADDR 0xAC3A //发送地址/**************************************************//*****点对点通讯地址设置******/#define RF_CHANNEL 20 // 频道11~26 #define PAN_ID 0x1A5B //网络id #define MY_ADDR 0xAC3A //发送地址/**************************************************//*****点对点通讯地址设置******/#define RF_CHANNEL 20 // 频道11~26 #define PAN_ID 0x1A5B //网络id #define MY_ADDR 0xAC3A // 本机模块地址#define SEND_ADDR 0x1015 //发送地址/**************************************************/注意:如果有多组同时进行试验,每组间的RF_CHANNEL和PAN_ID至少要有一个参数不同;如果多组间的RF_CHANNEL和PAN_ID都一样,会造成信号串扰。

短距离无线通信实验报告1

短距离无线通信实验报告1

实验课题:3.1 点对点射频通信实验3.1.1 实验目的? 在ZX2530A 型CC2530 节点板上运行相应实验程序。

? 熟悉通过射频通信的基本方法。

? 练习使用状态机实现收发功能。

3.1.2 实验内容接收节点上电后进行初始化,然后通过指令ISRXON 开启射频接收器,等待接收数据,直到正确接收到数据为止,通过串口打印输出。

发送节点上电后和接收节点进行相同的初始化,然后将要发送的数据输出到TXFIFO 中,再调用指令ISTXONCCA 通过射频前端发送数据。

3.1.3 实验设备及工具? 硬件:ZX2530A 型CC2530 节点板2 块、USB 接口的仿真器,PC 机Pentium100 以上。

? 软件:PC 机操作系统WinXP、IAR 集成开发环境、串口监控程序。

3.1.4 实验原理发送节点通过串口接收用户的输入数据然后通过射频模块发送到指定的接收节点,接收节点通过射频模块收到数据后,通过串口发送到pc在串口调试助手中显示出来。

如果发送节点发送的数据目的地址与接收节点的地址不匹配,接收节点将接收不到数据以下为发送节点程序流程图:程序开始初始化系统时钟初始化射频模块初始化串口通过串口发送数据以下为接收节点流程图程序开始初始化系统时钟初始化射频模块初始化串口等待 1 秒3.1.5 实验步骤1. 打开光盘“无线射频实验\2.点对点通信”双击p2p.eww 打开本实验工程文件。

2. 打开main.c文件下面对一些定义进行介绍RF_CHANNEL 此宏定义了无线射频通信时使用的信道,在多个小组同时进行实验是建议每组选择不同时信道。

但同一组实验中两个节点需要保证在同一信道,才能正确通信。

PAN_ID 个域网ID 标示,用来表示不同在网络,在同一实验中,接收和发送节点需要配置为相同的值,否则两个节点将不能正常通信。

SEND_ADDR 发送节点的地址RECV_ADDR 接收节点的地址NODE_TYPE 节点类型:0 接收节点,1:发送节点,在进行实验时一个节点定义为发送节点用来发送数据,一个定义为接收节点用来接收数据。

第五次无线传感器网络实验

第五次无线传感器网络实验

南昌航空大学实验报告二O 一六年五月 3 日课程名称:无线传感器网络实验名称:点对点通信实验班级:姓名:指导教师评定:签名:一、实验目的1. 了解CC2530无线通信的基本原理和用法;2. 掌握实验编译、下载和测试的方法;3. 分析CC2530 BasicRF工程的文件组织和源代码,为学习Z-Stack协议栈奠定基础。

二、实验内容1.将一个CC2530节点(称为1号节点)编程为受控节点,将另一个CC2530节点(称为2号节点)编程为控制节点;2.将2号节点的USB232通信接口通过USB线连接PC;在串口调试助手输入命令,以无线通信的方式控制1号节点上的LED。

三、基础知识1. 工程文件介绍CC2530 BasicRF有三个文件夹,本实验所使用的eww文件(workspace)是经过删减的,删掉了4个不使用的工程,仅保留了light_switch工程,并且此工程内部的LCD、button等硬件不具备的资源或不使用的资源相关的.h和.c文件进行了删减。

docs文件夹:打开文件夹里面仅有一个名为CC2530_Software_Examples的PDF文档,文档的主要内容是介绍BasicRF的特点、结构及使用,里面Basic RF包含三个实验例程:无线点灯、传输质量检测、谱分析应用。

Ide文件夹:有三个文件夹,及一个cc2530_sw_examples.eww工程,在IAR环境中打开,在workspace看到。

Ide\Settings文件夹:主要保存有读者自己的IAR环境里面的设置。

Ide\srf05_CC2530文件夹:仅有一个iar文件夹,进入之后有工程light_switch.eww,还有temp文件夹存放临时文件,settings文件夹存放工程的一些设置文件。

Source文件夹:打开文件夹里面有apps文件夹和components文件夹Source\apps文件夹:存放BasicRF实验的应用实现的源代码Source\components文件夹:包含着BasicRF的应用程序使用不同组件的源代码。

通信工程设计与监理《点对点通讯知识点教案》

通信工程设计与监理《点对点通讯知识点教案》

知识点 ZigBee点对点实验
一、教学目标:
(1)实现Zigbee节点的无线数据传输;
(2)熟悉Z-stac协议栈编程思路,及Z-stac协议栈工作原理;(3)了解Zigbee协议。

二、教学重点、难点:
理解ZigBee点对点实验的原理并掌握实验的步骤
三、教学过程设计:
1知识点说明
本实验要实现两个CC2530核心板在igbee协议的根底上实现数据的传输,即点对点网络的数据传输。

2知识点内容
1)igbee网络中的三种设备:协调器、路由器、终端节点。

2)ZigBee点对点通讯的过程。

3)实验的过程。

3知识点讲解
1)利用动画讲解ZigBee网络中的三种设备。

2)从ZigBee网络的三种设备开始,逐一讲解。

最后总结ZigBee 点对点通讯的过程。

3)利用录屏软件将实验的过程进行录制并进行讲解。

四、课后作业或思考题:
1、ZigBee网络中的三种设备是什么,分别说明。

2、画出协调器的工作流程图,并简要说明。

3、画出终端节点的工作流程图,并简要说明。

4、在实验过程中遇到的问题及解决方法。

五、本节小结:
利用协调器与终端节点实现两个CC2530核心板在igbee协议的根底上实现数据的传输,即点对点网络的数据传输。

点对多点通信实验

点对多点通信实验

《传感网原理及应用》实验报告专业班级:物联网工程姓名: ##学号: ##########指导教师:###评阅成绩:评阅意见:提交报告时间:2015年 12月 8日目录实验二点对多点通信实验1、实验目的…………………………………………………………………………2、实验内容…………………………………………………………………………3、实验步骤…………………………………………………………………………4、实验现象描述与实验结果分析…………………………………………………5、实验思考…………………………………………………………………………实验一点对点通信实验一、实验目的在对点对点无线通信理解的基础上,学习如何利用CC531实现zigbee模块的点对多的无线通信。

学习如何使用IAR的工程选项区分相同功能模块的不同处理,即一个工程中如果有多个RX该如何进行分别的处理。

二、实验内容让两台接收机接收同一台zigbee模块发送的数据,收到数据后通过小灯闪烁表示成功接收或发送数据。

三、实验步骤1.打开IAR工程“per_test.eww “2.打开工程文件后,进入工程界面:3. 在IAR工程中选择RF状态后,分别下载到三个zigbee模块中;1)选择发送状态TX,然后下载到zigbee模块中,作为点对多点无线无线通信的发送方;2)分别选择接收状态RX1和RX2,然后分别下载到zigbee模块中,作为点对多点无线通信的两个接收方。

四、实验现象描述与实验结果分析此为实验报告的重点部分,需要详细描述,包括1.对实验现象的描述三个zigbee模块中,作为发送端的zigbee模块黄灯闪烁,作为接收端的两个zigbee模块红灯和黄灯都闪烁.2.对实验结果的描述运行的结果是发送和接收模块上的小灯交替闪烁。

1) Zigbee数据发送模块:zigbee发送模块上电后,黄灯开始闪烁,表示数据已经正常发送,黄灯每闪烁一次,表示数据成功向两个zigbee模块轮询发送出去一次;2) Zigbee数据接收模块:zigbee接收模块RX1和RX2上电后,红灯一直闪烁,表示接收模块正常工作,准备好了接收工作;若接收模块上的黄灯闪烁,则表示接收到了zigbee数据发送模块的数据,黄灯闪烁一次表示成功接收到一次空口数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验题目:实验5--点对点无线通讯实验实验时间:2015.12.2一、实验目的:使用IAR开发环境设计R程序,利用2个CC2530 ZigBee模块实现点对点无线通讯。

二、实验原理及程序分析:a)硬件接口原理ZigBee(CC2530)模块 LED 硬件接口ZigBee(CC2530)模块硬件上设计有 2 个 LED 灯,用来编程调试使用。

分别连接 CC2530 的 P1_0、P1_1两个 IO 引脚。

从原理图上可以看出,2 个 LED 灯共阳极,当 P1_0、P1_1 引脚为低电平时候,LED 灯点亮。

b)关键函数1、射频初始化函数uint8 halRfInit(void)功能描述:zigbee 通信设置,自动应答有效,设置输出功率0dbm,Rx设置,接收中断有效。

参数描述: 无返回:配置成功返回 SUCCESS2、发送数据包函数uint8 basicRfSendPacket(uint16 destAddr, uint8* pPayload, uint8 length)功能描述:发送包函数。

入口参数:destAddr 目标网络短地址pPayload 发送数据包头指针,length 包的大小出口参数:无返回值:成功返回SUCCESS,失败返回FAILED3、接收数据函数uint8 basicRfReceive(uint8* pRxData, uint8 len, int16* pRssi)功能描述:从接收缓存中拷贝出最近接收到的包。

参数:接收数据包头指针接收包的大小返回:实际接收的数据字节数c)软件设计void main (void){uint8 i;appState = IDLE; // 初始化应用状态为空闲appStarted = FALSE; // 初始化启动标志位FALSE/* 初始化Basic RF */basicRfConfig.panId = PAN_ID; // 初始化个域网ID basicRfConfig.ackRequest = FALSE; // 不需要确认halBoardInit();if(halRfInit()==FAILED) //初始化hal_rfHAL_ASSERT(FALSE);/* 快速闪烁8次led1,led2 */for(i = 0; i < 16; i++){halLedToggle(1); // 切换led1的亮灭状态halLedToggle(2); // 切换led2的亮灭状态halMcuWaitMs(50); // 延时大约50ms}halLedSet(1); // led1指示灯亮,指示设备已上电运行halLedClear(2);basicRfConfig.channel = 0x0B; // 设置信道#ifdef MODE_SENDappTransmitter(); // 发送器模式#elseappReceiver(); // 接收器模式#endifHAL_ASSERT(FALSE);}void appTransmitter(){uint32 burstSize=0;uint32 pktsSent=0;uint8 appTxPower;uint8 n;/* 初始化Basic RF */basicRfConfig.myAddr = TX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}/* 设置输出功率 *///appTxPower = appSelectOutputPower();halRfSetTxPower(2);//HAL_RF_TXPOWER_4_DBM// halRfSetTxPower(appTxPower);/* 设置进行一次测试所发送的数据包数量 *///burstSize = appSelectBurstSize();burstSize = 100000;/* Basic RF在发送数据包前关闭接收器,在发送完一个数据包后打开接收器*/basicRfReceiveOff();/* 配置定时器和IO *///n= appSelectRate();appConfigTimer(0xC8);//halJoystickInit();/* 初始化数据包载荷 */txPacket.seqNumber = 0;for(n = 0; n < sizeof(txPacket.padding); n++){txPacket.padding[n] = n;}/* 主循环 */while (TRUE){if (pktsSent < burstSize){UINT32_HTON(txPacket.seqNumber); // 改变发送序号的字节顺序basicRfSendPacket(RX_ADDR, (uint8*)&txPacket, PACKET_SIZE);/* 在增加序号前将字节顺序改回为主机顺序 */UINT32_NTOH(txPacket.seqNumber);txPacket.seqNumber++;pktsSent++;appState = IDLE;halLedToggle(1); //切换LED1的亮灭状态halLedToggle(2); //切换LED2的亮灭状态halMcuWaitMs(1000);}/* 复位统计和序号 */pktsSent = 0;}}static void appReceiver(){uint32 segNumber=0; // 数据包序列号int16 perRssiBuf[RSSI_AVG_WINDOW_SIZE] = {0}; // 存储RSSI的环形缓冲uint8 perRssiBufCounter = 0; // 计数器用于RSSI缓冲区统计perRxStats_t rxStats = {0,0,0,0}; // 接收状态int16 rssi;uint8 resetStats=FALSE;int16 MyDate[10]; //串口数据串数字initUART(); // 初始化串口#ifdef INCLUDE_PAuint8 gain;// 选择增益 (仅SK - CC2590/91模块有效)gain =appSelectGain();halRfSetGain(gain);#endif/* 初始化Basic RF */basicRfConfig.myAddr = RX_ADDR;if(basicRfInit(&basicRfConfig)==FAILED){HAL_ASSERT(FALSE);}basicRfReceiveOn();/* 主循环 */while (TRUE){while(!basicRfPacketIsReady()); // 等待新的数据包if(basicRfReceive((uint8*)&rxPacket, MAX_PAYLOAD_LENGTH, &rssi)>0) {halLedSet(1); // 点亮LED1//halLedSet(2); // 点亮LED2UINT32_NTOH(rxPacket.seqNumber); // 改变接收序号的字节顺序segNumber = rxPacket.seqNumber;/* 若果统计被复位,设置期望收到的数据包序号为已经收到的数据包序号*/if(resetStats){rxStats.expectedSeqNum = segNumber;resetStats=FALSE;}rxStats.rssiSum -= perRssiBuf[perRssiBufCounter]; // 从sum中减去旧的RSSI值perRssiBuf[perRssiBufCounter] = rssi; // 存储新的RSSI 值到环形缓冲区,之后它将被加入sumrxStats.rssiSum += perRssiBuf[perRssiBufCounter]; // 增加新的RSSI值到sumMyDate[4] = rssi; ////MyDate[3] = rxStats.rssiSum;////if(++perRssiBufCounter == RSSI_AVG_WINDOW_SIZE){perRssiBufCounter = 0;}/* 检查接收到的数据包是否是所期望收到的数据包 */if(rxStats.expectedSeqNum == segNumber) // 是所期望收到的数据包{MyDate[0] = rxStats.expectedSeqNum;////rxStats.expectedSeqNum++;}else if(rxStats.expectedSeqNum < segNumber) // 不是所期望收到的数据包(收到的数据包的序号大于期望收到的数据包的序号){ // 认为丢包rxStats.lostPkts += segNumber - rxStats.expectedSeqNum;MyDate[2] = rxStats.lostPkts;///rxStats.expectedSeqNum = segNumber + 1;MyDate[0] = rxStats.expectedSeqNum;///}else // 不是所期望收到的数据包(收到的数据包的序号小于期望收到的数据包的序号){ // 认为是一个新的测试开始,复位统计变量rxStats.expectedSeqNum = segNumber + 1;MyDate[0] = rxStats.expectedSeqNum;///rxStats.rcvdPkts = 0;rxStats.lostPkts = 0;}MyDate[1] = rxStats.rcvdPkts;///rxStats.rcvdPkts++;UartTX_Send_String(MyDate,5);halMcuWaitMs(300);halLedClear(1); //熄灭LED1halLedClear(2); //熄灭LED2halMcuWaitMs(300);}}}流程图三、实验步骤及结果:在IAR开发环境中编译、运行、调试程序。

注意,本工程需要编译两次,一次编译发送器的,一次编译为接收器的,通过MODE_SEND宏选择,并分别下载入2个ZigBee模块中。

四、实验心得:无。

相关文档
最新文档