点对点通信实验步骤2017
- 格式:doc
- 大小:260.50 KB
- 文档页数:5
⽆线传感⽹——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过来的数据!"。
zigbee点对点通信流程下载温馨提示:该文档是我店铺精心编制而成,希望大家下载以后,能够帮助大家解决实际的问题。
文档下载后可定制随意修改,请根据实际需要进行相应的调整和使用,谢谢!并且,本店铺为大家提供各种各样类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,如想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by theeditor. I hope that after you download them,they can help yousolve practical problems. The document can be customized andmodified after downloading,please adjust and use it according toactual needs, thank you!In addition, our shop provides you with various types ofpractical materials,such as educational essays, diaryappreciation,sentence excerpts,ancient poems,classic articles,topic composition,work summary,word parsing,copy excerpts,other materials and so on,want to know different data formats andwriting methods,please pay attention!Zigbee 点对点通信流程Zigbee 是一种短距离、低功耗的无线通信技术,常用于物联网设备之间的通信。
实验一 WinSock点对点通信程序一、实验目的:WinSock是Windows操作系统下的Socket编程接口,通过WinSock函数库可以实现基于TCP/IP协议的进程之间通信。
●理解基于WinSock的客户/服务器概念●掌握使用WinSock进行编程的方法●了解常见WinSock开发模式的使用二、实验内容:基于WinSock开发一个简单的客户/服务器文本传输程序,客户端能够发送由标准输入得到的文本,服务器能够接收并将其显示在标准输出上。
三、实验环境:程序运行环境为以太网,采用TCP/IP协议栈,网络操作系统为Windows。
程序开发环境为vs2012版本。
四、实验步骤:步骤1 需求分析程序功能为:(1)服务器可以接受任何客户的连接(2)服务器在同一时刻只能与一个客户通信,直到该客户退出才可以接收下一个客户(3)客户程序使用命令行参数指定服务器地址(4)客户端输入的文本都发送给服务器(5)客户使用Ctrl+C键停止发送,关闭连接步骤2 服务器程序:定义全局变量:SOCKET Server; // 服务器端套接字SOCKADDR_IN Client_Addr; // 请求用户的Ip地址SOCKET Sock_Conn; // 是否建立连接成功char Buff_Recv[1024]; // 接收字符缓冲char Buff_Send[1024]; // 发送字符缓冲区服务器端主程序及用到的相关函数:void SLoad(); // 加载套接字库void SCreate(); // 创建套接字void SBind(); // 绑定套接字到一个IP地址和一个端口上void SListen(); // 将套接字设置为监听模式等待连接请求void SAccept(); /* 请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字 */void SClose(); // 关闭套接字void SUnLoad(); // 卸载套接字库void Receive(); // 接受请求void Send(); // 服务器段发送字符串到客户端主函数:int main(int argc, char* argv[]){…/* 循环查询 */while(1){SLoad();SCreate();SBind();SListen();SAccept();Receive();SClose();SUnLoad();}}步骤三、客户端程序:定义全局变量:SOCKET Client; // 客户端端套接字SOCKADDR_IN Server_Addr; // 服务器用户的Ip地址WSADATA wsaData;char Buff_Recv[1024]; // 接收字符缓冲char Buff_Send [1024]; // 发送字符缓冲区客户端主程序及用到的相关函数:void SLoad(); // 加载套接字库void SCreate(); // 创建套接字void SBind(); // 绑定套接字到一个IP地址和一个端口上void SAccept(); /* 请求到来后,接受连接请求,返回一个新的对应于此次连接的套接字 */void SClose(); // 关闭套接字void SUnLoad(); // 卸载套接字库void Receive(); //客户端接收字符串到客户端void Send(); // 发送请求主函数:int main(int argc, char* argv[]){…SLoad();SCreate();SBind();SAccept();/* 循环发送请求 */while(1)3Send();}SClose();SUnLoad();…}五、实验效果:➢服务器端接收请求:➢客户端输入服务器IP地址并等待响应:➢客户端选择命令帮助1进行通信 2退出➢服务器进行选择是否响应客户端开始通信:➢客户端:➢服务器端:六、实验总结:Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程,我们可以用它们来开发TCP/IP网络上的应用程序。
tcp协议上实现点对点通信的方法在当今的网络时代,点对点通信已成为各种应用场景中不可或缺的技术手段。
TCP(传输控制协议)作为一种可靠的传输协议,为实现点对点通信提供了有力保障。
本文将详细介绍在TCP协议上实现点对点通信的方法。
一、TCP协议简介TCP(传输控制协议)是一种面向连接、可靠的传输层协议。
它通过三次握手建立连接,确保数据传输的可靠性。
在TCP协议中,数据以流的形式传输,通信双方通过端口号区分不同的应用进程。
二、点对点通信的概念点对点通信是指两个网络节点之间直接进行数据交换,不需要经过第三方节点。
在TCP协议上实现点对点通信,可以有效降低通信延迟,提高数据传输效率。
三、实现点对点通信的方法1.基于TCP协议的Socket编程Socket编程是实现点对点通信的基础。
在Socket编程中,通信双方通过创建Socket对象,建立连接,然后进行数据传输。
(1)创建Socket对象在Java、C++等编程语言中,可以使用Socket类创建Socket对象。
例如,在Java中:```javaSocket socket = new Socket("对方IP地址", 对方端口号);```(2)建立连接创建Socket对象后,客户端与服务器端会进行三次握手,建立连接。
(3)数据传输连接建立后,双方可以通过Socket对象的输入输出流进行数据传输。
2.使用NIO(非阻塞IO)传统的Socket编程基于BIO(阻塞IO),在处理大量连接时,效率较低。
NIO(非阻塞IO)是一种更高效的IO模型,可以实现对大量连接的高效处理。
在Java中,可以使用Selector对象实现NIO。
Selector可以监控多个Socket连接,当某个Socket连接有数据可读或可写时,Selector会通知应用程序进行处理。
3.使用第三方库为了简化点对点通信的实现,可以使用第三方库,如Netty、MINA等。
这些库封装了底层的Socket通信细节,提供了更易用的API。
基于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套接字与对话框界面建立联系。
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--点对点无线通讯实验实验时间: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. 实验结果与分析经过实验测试,我们成功地搭建了一个无线射频点对点通信系统,并进行了一些简单的通信测试。
基于CAsyncSocket类的点对点通信客户机创建流程
●通信流程:
1.服务器点击“监听”按钮开始监听,实现Create和Listen函数
2.客户机点击“连接”按钮进行连接,实现Connect函数
3.服务器端接受连接,并触发onAccept事件,实现函数Aeecpt
4.客户端或者服务器端点击“发送”按钮,发送文本框的数据
5.服务器端或者客户端接收数据,OnReveive事件被触发,实现函数Receive
6.客户端或者服务器端点击“断开”,执行函数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(),如果是服务器端还要加载onAccept
5、程序的各个类之间建立联系,具体步骤:
5.1对话框界面与套接字建立连接。
在ClientDlg.h文件中将“clientsock.h”文件包含进来,使其能够访问套接字,代码为#include”clientsocket.h”;并添加成员变量m_clientsock,代码clientsock m_clientsock;
5.2套接字与对话框界面建立联系。
在套接字的源文件clientsock.cpp中,为使其能够访问对话框界面,添加对话框类头文件 #include”ClinetDlg.h”
5.3套接字类能够方便访问对话框的成员.在对话框中定义指向本身的指针,并在套接字类中引用该指针
在clientDlg.Cpp中定义个全局变量,类型为对话框指针
5.4在初始化函数中给指针赋值。
将当前对话框赋值给指针变量:
extern CClientDlg * pdlg;
经过以上步骤,类之间的关系,以及对话框指针的设置完成。
服务器过程与客户端是一样的,区别在于5.1创建套接字变量时应创建两个,一个用于监听,一个用于服务。
接下来是具体的编程过程
服务器端,如果工程名为server,插入的类名为sersock,且界面如下图,并按上述客户端方式已做基本设置,包括文件互相包含、创建指针机制、建立类向
导,载入虚函数。
如这些都完成,则开始编程
1、在类视图下,点击CServerDlg右键单击添加函数void myaccept(), void myrecv()和void myclose()
2、双击监听按钮,实现监听:使用updatedata(),Create()和Lisen()
3、双击发送按钮,实现发送:使用Send()
4、当有客户端连接进来时,触发sersock下的onAccept()此函数下执行
pdlg->myaccept();在myaccept()中执行Accept()
5、当有消息进来时,触发sersock下的onreceive()此函数下执行
pdlg->myrecv();在myrecv()中执行Receive()
客户端
6、在类视图下,点击CClientDlg右键单击添加函数 void myrecv()和void myclose()
7、双击连接,实现updatedata(),Create()和Connect()
8、双击发送按钮,实现发送:使用Send()
9、当有消息进来时,触发clientsock下的onreceive()此函数下执行
pdlg->myrecv();在myrecv()中执行Receive()
10、。