极客工坊

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 5514|回复: 0

nRF24 收發模塊測試

[复制链接]
发表于 2013-8-19 09:32:05 | 显示全部楼层 |阅读模式
忽然一堆人在玩nRF24L01,手癢就跟著跳進來

下面代碼是參考RF24的例子改成用Mirf庫,收發端共用同一個代碼
接收端可以只接電源,發送端啟動後要在串口輸入C切換

  1. /**
  2. *
  3. * Pins:
  4. * Hardware SPI: UNO / LEONARDO
  5. * MISO -> D12 / ICSP 1
  6. * MOSI -> D11 / ICSP 4
  7. * SCK -> D13 / ICSP 3
  8. *
  9. */

  10. #include <SPI.h> // required by Mirf library
  11. #include <Mirf.h> // required by Mirf library
  12. #include <nRF24L01.h> // required by Mirf library
  13. #include <MirfHardwareSpiDriver.h> // required by Mirf library


  14. byte* SERVER_ADDR = (byte*)"srv01"; // 5 bytes addr
  15. byte* CLIENT_ADDR = (byte*)"cli01"; // 5 bytes addr
  16. boolean clientMode = false; // start mode using serverMode
  17. unsigned long TIMEOUT = 2000; // server response timeout for 2s
  18. unsigned long sendTime; // time when client send data

  19. void setup(){
  20.   Serial.begin(9600);
  21.   
  22.   Mirf.cePin = 8; // default using pin 8
  23.   Mirf.csnPin = 7; // default using pin 7
  24.   Mirf.channel = 1; // default value
  25.   Mirf.payload = 5; // define data length
  26.   Mirf.spi = &MirfHardwareSpi;
  27.   Mirf.init();

  28.   /*
  29.    * Mirf will always listen to RADDR.
  30.    * And set TADDR to the RADDR of the other end.
  31.    */
  32.   Mirf.setRADDR(SERVER_ADDR); // 5 bytes addr
  33.   Mirf.setTADDR(CLIENT_ADDR); // 5 bytes addr
  34.   Mirf.config();
  35.   
  36.   Serial.print("\r\nConfigure as server.");
  37.   Serial.println("Change to client by input 'C'.");
  38. }

  39. void loop(){
  40.   byte buffer[5] = {0xFF,0x00,0x00,0x00,0xFF}; // 5 bytes data
  41.   
  42.   if(Serial.available()){ // read input first
  43.     char c = toupper(Serial.read());
  44.     if(c == 'C' && !clientMode){ // set to client mode
  45.       Serial.print("Configure as client mode.");
  46.       Serial.println("Change to server by input 'S'.");
  47.       clientMode = true;
  48.       
  49.       Mirf.setRADDR(CLIENT_ADDR); // 5 bytes addr
  50.       Mirf.setTADDR(SERVER_ADDR); // 5 bytes addr
  51.     }
  52.     else if(c == 'S' && clientMode){ // set to server mode
  53.       Serial.print("Configure as server mode.");
  54.       Serial.println("Change to client by input 'C'.");
  55.       clientMode = false;
  56.       
  57.       Mirf.setRADDR(SERVER_ADDR); // 5 bytes addr
  58.       Mirf.setTADDR(CLIENT_ADDR); // 5 bytes addr
  59.     }
  60.   }
  61.   
  62.   if(clientMode){
  63.     buffer[1] = 0xEF; buffer[2] = 0xFF; // client heart beat: FFEFFFxxFF
  64.     sendTime = millis();
  65.     Mirf.send(buffer);
  66.     while(Mirf.isSending()); // wait for sending
  67.     Serial.println("Send client heart beat!");
  68.     while(!Mirf.dataReady()){
  69.       if((millis() - sendTime) > TIMEOUT){
  70.         Serial.println("Server response timeout!");
  71.         return;
  72.       }
  73.     }
  74.     Mirf.getData(buffer);
  75.     if(buffer[0] != 0xFF || buffer[4] != 0xFF) // drop error reading
  76.       return;
  77.     if(buffer[1] == 0xEF && buffer[2] == 0x00){ // server heart beat: FFEF00xxFF
  78.       Serial.println("Got server heart beat!");
  79.     }
  80.     delay(1000); // send heart beat after 1s
  81.   }
  82.   
  83.   else if(!Mirf.isSending() && Mirf.dataReady()){ // Server Mode and recieved
  84.     Mirf.getData(buffer);
  85.     if(buffer[0] != 0xFF || buffer[4] != 0xFF) // drop error reading
  86.       return;
  87.     // client heart beat: FFEFFFxxFF, server heart beat: FFEF00xxFF
  88.     if(buffer[1] == 0xEF && buffer[2] == 0xFF){
  89.       Serial.println("Got client heart beat!");
  90.       buffer[2] = 0x00; // format: FFEF00xxFF
  91.       Mirf.send(buffer);
  92.       while(Mirf.isSending()); // wait for sending
  93.       Serial.println("Send server heart beat!");      
  94.     }
  95.   }
  96. }
复制代码
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 需要先绑定手机号

Archiver|联系我们|极客工坊

GMT+8, 2024-4-25 17:15 , Processed in 0.037965 second(s), 17 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表