实验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都一样,会造成信号串扰。
3.下载代码
把编译生成的两个代码分别下载到两个节点模块中。 4.运行
两个节点模块分别接到PC机串口,串口的波特率设置为38400, 模块 上电。
一个串口发送的数据,在另一个串口就能完整地显示,如图2-2所示:
图2-2无线串口实验结果
【实验相关代码】
主文档uart_rf.c中的相关代码:
/*****************点对点通讯地址设置********************/ #define RF_CHANNEL 20 // 频道 11~26 #define PAN_ID 0x1379 //网络id #define MY_ADDR 0x1234 // 本机模块地址 #define SEND_ADDR 0x5678 //发送地址 /*******************************************************/ static basicRfCfg_t basicRfConfig;
/**************************************************/ // 无线RF初始化 void ConfigRf_Init(void) {
basicRfConfig.panId = PAN_ID; //zigbee的ID号 设置
basicRfConfig.channel = RF_CHANNEL; //zigbee的频道设置
basicRfConfig.myAddr = MY_ADDR; //设置本机地址 basicRfConfig.ackRequest = TRUE; //应答信号 while(basicRfInit(&basicRfConfig) == FAILED); //检测zigbee的参数是否配置成功 basicRfReceiveOn(); // 打开RF }
/********************MAIN************************/ void main(void) { uint16 len = 0;
halBoardInit(); //模块相关资源的初始化 ConfigRf_Init(); //无线收发参数的配置初始化 halLedSet(3); halLedSet(4); while(1) {
len = RecvUartData(); // 接收串口数据 if(len > 0) { halLedToggle(3); // 绿灯取反,无线发送指示 //把串口数据通过zigbee发送出去
basicRfSendPacket(SEND_ADDR, uRxData,len); } if(basicRfPacketIsReady()) //查询有没收到无线信号 {
halLedToggle(4); // 红灯取反,无线接收指示 //接收无线数据 len = basicRfReceive(pRxData, MAX_RECV_BUF_LEN, NULL); //接收到的无线发送到串口数 halUartWrite(pRxData,len); } } } /************************main end
*********************************************/
【思考题】
1. 掌握无线发送和接收的方法。 2. 掌握串口接收和发送的方法。 3. 本例两个串口的波特率相同(都为38400),如果两个串口的波特率不相同,能进行通讯吗?如果能,该如何实现?
4. 如果数据在无线发送时要进行加密,接收到无线数据后进行相应的解密,在软件上该如何实现?