点对点通信实验小结

 

zigbee点对点通信 2010-06-28 21:47:32 阅读36 评论0 字号:

协议栈版本信息: 无线龙2004协议栈 点对点无线通信实验


今天晴天从以前430那数据采集板上取了一块好的CC2430模块,这样5块里面有两块能用了,下午做了下点对点的通信.

总结下.
实验的内容是发送节点A发送字符串到接收节点B,节点B再把接收到的数据通过串口送PC显示.(由于扩展板液晶有问题只能送PC显示数据)
主要改动集中在rf_test.c这个文件中.

/********************************************
Filename:     rf_test.c
Target:       cc2430
Revised:      16/12-2005
Revision:     1.0

Description:
    This file provides 4 small tests which demonstrates use of the radio.

*********************************************/

#include "ioCC2430.h"
#include "cul.h"
#include "hal.h"
#include "RF04EB.h"


#define ADDRESS_0 0x01
#define ADDRESS_1 0x02

#define SEND     0
#define RECEIVE  1

#define SINGLE      0
#define CONTINUOUS  1
#define PING_PONG   2
#define PER_TEST    3
#define EXIT        4

#define RECEIVE_TIMEOUT               800

#define PING_PONG_TIMEOUT             1200
#define PING_PONG_REQUEST             0x80
#define PING_PONG_RESPONSE            0x40

#define PER_RECEIVE_TIMEOUT          10000
#define PER_TOTAL_PACKET_NUMBER       1000
#define PER_TEST_REQUEST              0x20


void initRfTest(void);
void rf_test_main(void);
void receivePacket(UINT8 *receiveByte);
void sendPacket(UINT8 sendByte);

 

void receiveMode(void);
void contionuousMode(void);

 


UINT8 RxTxState;
UINT8 myAddr;
UINT8 remoteAddr;
/********************************************
* @fn  initRfTest
*
* @brief
*      Initializes components for the RF test application example.
*
* Parameters:
*
* @param  void
*
* @return void
*
*********************************************/
void initRfTest(void)
{
   UINT32 frequency = 2405000;
   INIT_GLED();
   INIT_YLED();
   radioInit(frequency, myAddr);
}


/*********************************************
* @fn  rf_test_main
*
* @brief
*      Main function.
*
* Parameters:
*
* @param  void
*
* @return void
*
**********************************************/
#ifdef COMPLETE_APPLICATION
void rf_test_main(void){
#else
void main(void){
#endif
   INT_GLOBAL_ENABLE(INT_ON);
   P1_2 = 0;  //###设为0下载进发送节点;设为1下载进接收节点
   if(P1_2)
   {
      myAddr = ADDRESS_0;
      remoteAddr = ADDRESS_1;
      initRfTest();
                        receiveMode();  //P1_2 = 1 接收
   }
   else
   {
      myAddr = ADDRESS_1;
      remoteAddr = ADDRESS_0;
      initRfTest();
                        contionuousMode();  //P1_2 = 0 发送
   }
}

/**********************************************
* @fn  contionuousMode
*
* @brief
*      Function for transferring packets until stopped by user.
*
* Parameters:
*
* @param  void
*
* @return void
*
**********************************************/
void contionuousMode(void)
{
   BOOL res;
   //BYTE sendBuffer[ ] = "hello.";
   BYTE sendBuffer[ ] = "hello! my name is WuJianFeng.";
   while(1)
   {
      GLED = LED_OFF;  //红灭
      YLED = LED_ON;    //黄亮
      res = radioSend(sendBuffer, sizeof(sendBuffer), remoteAddr, DO_NOT_ACK );
      halWait(200);
      YLED = LED_OFF;  //黄灭
      halWait(200);
      if(res == TRUE)
      {
         GLED = LED_ON;  //红亮
         halWait(200);
      }
      else
      {
         GLED = LED_OFF;  //红灭
         halWait(200);
      }
   }
}

/******************************/
/*
void txdata(BYTE* dat)  //###串口发送函数:字符串,字符
{
 while(*dat)
 {
  U0DBUF=*dat++;
  while(!UTX0IF);
  UTX0IF=0;
 }
}
*/

void txdata_1(BYTE dat) //###串口发送函数:单个字符
{
 U0DBUF = dat;
 while (!UTX0IF);
 UTX0IF = 0;
}


void UartTX_Send_String(char *Data,int len) //###串口发送函数:字符串
{
  int j;
  for(j=0;j<len;j++)
  {
    U0DBUF = *Data++;
    while(UTX0IF == 0);
    UTX0IF = 0;
  }
}
/**********************************************
* @fn  receiveMode
*
* @brief
*      Function for receiving data.
*
* Parameters:
*
* @param  void
*
* @return void
*
***********************************************/
void receiveMode(void)
{
   BYTE* receiveBuffer;
   BYTE length;
   BYTE res;
   BYTE sender;
  
   while(1)
   {
      YLED = LED_ON;  //黄亮
      res = radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender);
      YLED = LED_OFF;  //黄灭
     
      //res = TRUE;//###个人添加
     
      if(res == TRUE)
      {
         GLED = LED_ON;  //红亮
         halWait(200);
        // txdata_1('x');
         UartTX_Send_String(receiveBuffer,length);  //###把接收到的数据通过串口送PC
         txdata_1(' \n ');  //###换行符
      }
      else
      {
         GLED = LED_OFF;  //红灯—原:OFF
         halWait(200);
      }

      GLED = LED_OFF;  //红灯—原:OFF
   }
}


//-----------------------------------------
//###添加的串口接收中断函数
#pragma vector = URX0_VECTOR
 __interrupt void URX0_ISR(void)
 {
    unsigned uarttemp;
    uarttemp = U0DBUF; //串口调试软件发送的数据给uarttemp
    U0DBUF = uarttemp; //把接收到的数据返送串口软件显示
}
/***********************************************/

在rf_test_main()中设置P1.2=0,把程序下载进发送节点A,设置P1.2=1下载进接收节点B;个人这样做是不准备用外部跳线来设置节点类型.

函数radioReceive(&receiveBuffer, &length, RECEIVE_TIMEOUT, &sender)的原型是
BOOL radioReceive(BYTE** receiveData, BYTE* length, WORD timeout, BYTE* sender)
receiveData是一个双重指针变量,receiveBuffer是一个指针变量,从上面可以看到双重指针变量receiveData是指向指针变量receiveBuffer,而receiveBuffer指向BYTE型变量的数据,即*receiveData指向BYTE型变量的数据.
*receiveData = rxData.payload
接收中payload是一个数组,把数组的首地址赋给*receiveData
因而这里:
UartTX_Send_String(receiveBuffer,length)
UartTX_Send_String(char *Data,int len)
是把BYTE型变量数据(即数组payload内的数据)首地址赋给*Data.


程序中的YLED和GLED与我板上的灯不匹配,具体信息可以参见<CC2430单片机LED实验>这篇记录.
从发送节点A的contionuousMode()函数来看,如果发送成功,则板上的红黄灯会不停地亮灭;
而从接收节点B的receiveMode()函数来看,如果接收成功,板上的红黄灯也会不停地亮灭;这时如果把发送节点A关闭,则红灯灭,黄灯不停地亮灭,这点可以自己试验下.
我在程序中添加了两个函数,一个是txdata_1()用于在接收节点B中发给串口单个字符;一个是UartTX_Send_String()用于在接收节点B中发给串口字符串.最后的串口接收中断函数只是为了看下回显情况.
第一次是发送sendBuffer[ ] = "hello.";
第二次是发送sendBuffer[ ] = "hello! my name is WuJianFeng."; 和'\n'换行符

实验结果如下:

 

发送节点A:
点对点通信实验小结 - 小峰 - happy~
 

 接收节点B:

点对点通信实验小结 - 小峰 - happy~

 

第一次是发送sendBuffer[ ] = "hello.";
点对点通信实验小结 - 小峰 - happy~
 

 第二次是发送sendBuffer[ ] = "hello! my name is WuJianFeng."; 和'\n' 换行符

11是验证下程序最后的串口接收中断函数是否有效.

点对点通信实验小结 - 小峰 - happy~

 

发送节点A与接收节点B.具体能有多远我没有去测试.点对点通信实验小结 - 小峰 - happy~

点对点通信实验小结 - 小峰 - happy~

 

    本想试验下发送节点A和接收节点B都通过串口与PC相连,在串口助手上发送数据.下次有空再做下.

************************************************************************************************

*************************************************************************************************

说明:
本文作者所记录,错误处还请高手指点,本人随时更新,转载请注明出处。谢谢!
 注意波特率为57600                                                           2010.6.28   ~XF点对点通信实验小结 - 小峰 - happy~

 更新:2010.6.29

posted @ 2010-07-04 03:10  邵利超  阅读(5088)  评论(0编辑  收藏  举报