点对点通信实验步骤2017
(单片机原理与应用实验)实验9点对点串行通信

波特率
串行通信接口
单片机上的串行通信接口通常包括发 送数据端(TXD)、接收数据端 (RXD)和地线(GND)。
表示每秒钟传输的位数,是衡量串行 通信速度的参数。
串行通信的分类
同步串行通信与异步串行通信
同步串行通信是指发送方和接收方以相同的时钟频率进行数据传输,而异步串 行通信则没有共同的时钟频率。
02
例如,空调的温度设置、电视的频道切换等操作,都是通过性、易扩展等优点,因此
03
在智能家居领域得到广泛应用。
在工业控制中的应用
在工业控制系统中,各种传感器、执行器等设备需要实时地进行数据传输和控制。 点对点串行通信能够满足工业控制领域对实时性、可靠性和安全性的高要求。
波特率设置
波特率计算
根据通信协议的要求,计算出合 适的波特率。常用的波特率有 9600、19200、4800等。
寄存器配置
根据计算出的波特率,配置单片 机串行通信接口的相关寄存器, 以实现所需的波特率。
测试与调整
在实际通信过程中,可能需要根 据实际情况调整波特率,以确保 数据传输的稳定性和正确性。
(单片机原理与应用实 验)实验9点对点串行 通信
contents
目录
• 单片机串行通信原理 • 点对点串行通信的实现 • 单片机点对点串行通信实验步骤 • 点对点串行通信的应用 • 点对点串行通信的优缺点 • 点对点串行通信的未来发展
01
单片机串行通信原理
串行通信的基本概念
串行通信
指数据在单条线路上一位一位地传输, 具有节省传输线、成本低、远距离传 输可靠等优点。
单工、半双工和全双工串行通信
单工是指数据只能向一个方向传输,半双工是指数据可以在两个方向上传输, 但不能同时进行,全双工则是指数据可以在两个方向上同时传输。
无线传感网——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过来的数据!"。
zigbee点对点通信流程

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点对点通信程序一、实验目的: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协议中,数据以流的形式传输,通信双方通过端口号区分不同的应用进程。
二、点对点通信的概念点对点通信是指两个网络节点之间直接进行数据交换,不需要经过第三方节点。
在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。
点对点通信实验步骤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套接字与对话框界面建立联系。
点对点通信

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--点对点无线通讯实验实验时间: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. 实验结果与分析经过实验测试,我们成功地搭建了一个无线射频点对点通信系统,并进行了一些简单的通信测试。
点对多点通信实验

《传感网原理及应用》实验报告专业班级:物联网工程姓名: ##学号: ##########指导教师:###评阅成绩:评阅意见:提交报告时间: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数据发送模块的数据,黄灯闪烁一次表示成功接收到一次空口数据。
(单片机原理与应用实验)实验9点对点串行通信

Keil μVision5集成环境、c51 C语言编译器。
实验工具
虚拟示波器、示波器探头、手机App等。
实验电路图设计
电路图
单片机与串行通信电路、LED等外设的连接示意图。
面包板图
实际硬件连接呈现。
操作流程图
将电路图抽象为具有流程性的操作步骤。
单片机程序设计
程序框架
位移寄存器、数据缓存、波特率设定等模块的初始 化及配置。 循环结构及条件语句的实现。
点对点串行通信应用举例
红外线遥控器
利用红外线的点对点传输方式实现遥控器功能,如电视、空调、音响、洗衣机等。
伺服电机控制
点对点控制伺服电机,实现位置和速度的精确控制,并适用于注塑机、膜伸展机、食品包装 机、自动编织机等。
无线打印机
点对点串行通信协议实现无线打印任务和数据的传输,便捷快速。
串行通信的发展历程
2 实物配套商品管理
从规则定制、金融支付等方面实现物联网的数据传输。
3 工业生产及维护领域
通过大型企业、设备间便捷的数据交换维护制造优势。
串行通信技术在远程监控和数据采集中的 应用
传感器技术
基于串行通信方式的拓展,可以很容易的构建海量 传感器测量点与控制中心间的 (远程) 数据传输通路。
遥测技术
点对点串行通信技术的突破,实现多类传感器数据 信息的及时采集与应用,如农业养殖行业等。
传输速率的检测和优化
速率检测
通过压缩测试、速率检测等方式测量数据传输的速 率。
数据缓存优化
使用FIFO缓存、循环存储等方式提高数据传输效率。
基于串行通信的多个设备之间的通信
1
主从通信模式
通信的双方划分为主设备和从设备,实现多方互通的目的。
atos点对点通信实验报告心得

atos点对点通信实验报告心得
5月20日,中国人民在首都北京天安门广场隆重集会,纪念“五四”运动101周年。
当前的实验就是利用一台“创新通信实验平台”进行点对点通信的实验。
本次实验主要内容包括:点对点通讯器、接收机、发射机以及蓝牙、 wifi 等多种无线技术结合起来的移动设备。
该实验所使用的两台接收机可同时连接10个点或100个点。
实验主要分为三步:1、下载、解压、安装与硬件相关的模块;2、调试和编译程序;3、组建实验环境并将蓝牙和 wifi 作为通信工具进行测试。
我们需要注意的是,每一部分都有很大的学问,尤其是第二步——调试和编译程序。
这里面涉及到的知识非常之多,如果没有扎实的基础,那么根本不能完成任务。
而且还必须得熟悉各类软件开发语言,比如 C++、 java、 C#、 Python 等等。
因此,只有掌握了足够的理论知识才能更好地去应付它!
首先,我们需要做的事情便是下载、解压、安装与硬件相关的模块。
这些东西都被封存于一个文件夹中,我们只需双击它即可打开。
这样既方便又快捷,省却了许多麻烦。
然后,我们需要做的便是调试和编译程序。
这也是最难的一项,但只要你耐心细致,认真钻研,总归会找出规律的。
其次,我们需要准备一套完整的蓝牙和 WiFi 通信系统。
- 1 -。
实验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都一样,会造成信号串扰。
串口组件通信与点对点通信实验

《物联网概论》实验报告实验题目:串口组件通信与点对点通信实验
8. 在串口通讯代码目录下执行 make antc5 install,进行编译和烧录
实验结果:
2、ATOS 点对点通信实验
1. 将 J-Link 对应端插入 ATOS 多模汇聚节点的 CN3 引脚,将 ATOS 多模汇聚节点上的 STM32
同电脑连接起来。
2. 打开 J-Flash 软件,按照路径光盘 A/02 演示中心/STM32 相关 HEX 打开
M3GW-PC.hex,并
将其烧录到 ATOS 多模汇聚节点的 STM32 芯片中。
实验心得体会:
由于自己的电脑没有装上环境,所以是和同学一起完成的实验。
实验过程中jlink 安装后运行出现了问题,在问了老师之后是发现波特率没调对。
改成9600之后就好了。
实验四点对点数字光纤传输实验

实验四点对点数字光纤传输实验一.实验目的1.了解点对点光纤传输网的的结构和工作原理。
2.熟悉光纤收发器的使用方法。
二.实验原理点对点光纤传输网利用光纤将相对位置较近(小于10km)的用户连接起来,每一个用户都能提供随机的发送/接收数据功能的网络。
本实验系统结构如图4.1所示:TER850光纤收发器1 TER850光纤收发器2图4.1 点对点光纤传输网结构仪器介绍:1.TER850光纤收发器TER850光纤收发器的外观如图4.2所示。
TER850光纤收发器的工作原理:将从RJ45插座接收到的电信号转换为光信号,再将光信号通过光输出口(TX)发送到光纤中传输。
将从光输入口(RX)接收到的光信号转换为电信号,再将电信号通过RJ45插座发送到电缆中传输。
主要特点包括:1)RJ45插座:通过双绞线外接其他网络设备(如计算机)。
DC电源插座:外接DC+5V,1.5A电源。
SC光纤连接头:其中有一个光输出口(TX)和一个光输入口(RX)。
通过光纤活动连接器发送或接收光信号。
2)三个LED指示灯:Power指示灯:接通DC+5V,1.5A电源时,该指示灯亮。
TX Link/Rx指示灯,有两种状态:亮:表示RJ45端口正常连接到网络。
闪烁:表示正从RJ45端口接收数据。
FX Link/Rx指示灯,有两种状态:亮:表示SC光纤连接头正常连接到网络。
闪烁:表示正从SC光纤连接头接收数据。
2)100Mbps数据传输率3)自动检测半双工/全双工模式。
4)全双工模式下支持2KM以上的远程传输。
5)标准RJ45插座和连接头及引脚定义。
图4.2 TER850光纤收发器的外观标准RJ45插座和连接头的外形如图4.3所示。
图4.3 标准RJ45插座和连接头的外形TER850光纤收发器通过交叉网线与计算机的网卡接口连接如图4.4所示。
TER850 计算机图4.4 TER850光纤收发器通过交叉网线与计算机的网卡接口连接三.实验设备1.TER-850光纤收发器两台2.AC/DC电源转换器两个3.多模室内光缆10米4.两端带RJ-45连接头的交叉网线两条四.实验步骤1.根据系统结构图4.1将各设备连接起来。
Zigbee点对点通信

Zigbee点对点通信搞了整整一天,参考了很多大侠的学习记录,才完成这个点对点通信实验,结果却是因为我串口TX\RX接错引脚了,所以串口才一直没有显示,还是自己太马虎,下面记录下我的学习过程:1、实验设备:CC2430 模块两块,一个做RX模块,一个做TX模块2、实现功能:TX模块向RX模块发送固定字符串“Hello World”,RX模块与PC机串口相连,收到数据后,送到PC机上显示。
3、实验中有关射频收发的重要函数:1)射频初始化函数BOOL sppInit(UINT32 frequency, BYTE address)功能描述:初始化简单的数据包装协议Simple Packet Protocol (SPP),从 DMA 管理器申请两个 DMA 通道,用于分别从 Rx FIFO 和Tx FIFO 传输数据。
定时器4 管理器同样被设置,这个单元用于在数据包发送后接收器在一定时间内没有返回应答时产生中断。
无线部分配置为发送,工作在特定的频率,在发送时自动计算和插入和检查CRC 值。
参数描述:UINT32 frequency:RF 的频率(kHz.);BYTE address:节点地址返回:配置成功返回TRUE,失败返回FALSE2)发送数据包函数BYTE sppSend(SPP_TX_STRUCT* pPacketPointer)功能描述:发送length 字节的数据(最多122),标志,目的地址,源地址在Tx DMA 通道传送有效载荷到Tx FIFO 前插入,如果期望应当,设置相应的标志。
参数:SPP_TX_STRUCT* pPacketPointer:发送数据包头指针返回:发送成功返回TRUE,失败返回FALSE。
3)接收数据函数void sppReceive(SPP_RX_STRUCT *pReceiveData)功能描述:这个函数使能接收128 字节,包括头和尾。
接收数据通过DMA 传输到pReceiveData。
点对点串行通信

;回写 ;允许串行口接收新的数据 ;执行串行输出子程序,将笔段码送LED ;等待 ;串行中断服务子程序
;切换工作寄存器区
实验9 点对点串行通信
JNB RI,NEXT1
CLR RI
;清除接收中断
JBC SCON.7,RERROR
;帧错误
MOV A,SBUF
;执行奇偶校验,P标志与RB8位应该相同,否则偶校验错
MOV RXDC,#0
;复位接收字节计数器
SETB FRAMES
;帧开始标志有效
SJMP NEXT1
NEXT11:
;非帧首信息
JNB FRAMES,RERROR ;在这之前尚未接收到帧开始标志
;当前接收内容为帧内数据信息
MOV A,RXDC
实验9 点对点串行通信
ADD A,#RXDB
;加接收缓冲区首地址
LOOP1: ADD A,@R0 INC R0 DJNZ R7,LOOP1 XRL A,@R0 JNZ RERROR ;正确 MOV A,@R0 ORL A,#80H MOV @R0,A MOV A,#0A5H CLR REN SJMP TXDACK
;累加求和
;与接收到的和校验字节异或
;接收缓冲区数据有效标志置1 ;发送0A5H应答信号 ;停止接收,等待处理接收数据
(1) 数据帧格式为:0AAH(起始标志)+4字节信息+1字节的 和校验信息。
实验9 点对点串行通信
(2) 接收方正确接收后回送A5作应答;如果错误,则回 送A6,请求重发。
(3) 发送/接收缓冲区在30H~35H单元,其中35H单元存 放和校验信息 (b7作接收缓冲数据有效标志)。
(4) 发送、接收均采用中断方式。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
基于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、。