C++ Adafruit Feather RFM69HCW在使用过程中冻结,需要硬复位

C++ Adafruit Feather RFM69HCW在使用过程中冻结,需要硬复位,c++,c,arduino,radio,adafruit,C++,C,Arduino,Radio,Adafruit,我正在帮助建造一台农业机器的原型。它使用Adafruit无线电模块进行无线电控制: 系统工作正常,但接收器间歇性冻结,需要关闭/打开电源或重置才能恢复正常。由于系统是远程控制的,这是不可接受的,并且考虑到机器的性质,可能存在潜在的危险 下面是接收器的代码。基本上是一长串“if”语句,带有适当的digitalWrite命令,用于关闭/打开各种输出 我对编写这样的软件相当陌生,所以我相信还有很多地方可以改进。然而,首要任务是找出模块不时冻结的原因 感谢您的帮助!谢谢 // INCLUDE PACK

我正在帮助建造一台农业机器的原型。它使用Adafruit无线电模块进行无线电控制:

系统工作正常,但接收器间歇性冻结,需要关闭/打开电源或重置才能恢复正常。由于系统是远程控制的,这是不可接受的,并且考虑到机器的性质,可能存在潜在的危险

下面是接收器的代码。基本上是一长串“if”语句,带有适当的digitalWrite命令,用于关闭/打开各种输出

我对编写这样的软件相当陌生,所以我相信还有很多地方可以改进。然而,首要任务是找出模块不时冻结的原因

感谢您的帮助!谢谢

// INCLUDE PACKAGES
#include <SPI.h>
#include <RH_RF69.h>

// DEFINE RADIO FREQUENCY
#define RF69_FREQ 433.0

// DEFINE OUTPUTS
#define A_UP          13
#define A_DOWN        12
#define B_UP          11
#define B_DOWN        10
#define D_DOWN        18
#define E_UP          9
#define E_DOWN        6
#define F_UP          5
#define F_DOWN        19

#define C_1           20
#define C_2           21
#define C_3           22

// DEFINE RADIO PINS
#define RFM69_CS      8
#define RFM69_INT     7
#define RFM69_RST     4

// LOAD RADIO DRIVER
RH_RF69 rf69(RFM69_CS, RFM69_INT);

// CREATE GLOBAL VARIABLES
int16_t packetnum = 0;

void setup() 
{
  Serial.begin(9600);

  pinMode(RFM69_RST, OUTPUT);
  digitalWrite(RFM69_RST, LOW);

  Serial.println("Feather RFM69 RX Test!");
  Serial.println();

  // manual reset
  digitalWrite(RFM69_RST, HIGH);
  delay(10);
  digitalWrite(RFM69_RST, LOW);
  delay(10);

  if (!rf69.init()) {
    Serial.println("RFM69 radio init failed");
    while (1);
  }
  Serial.println("RFM69 radio init OK!");

  // Defaults after init are 434.0MHz, modulation GFSK_Rb250Fd250, +13dbM (for low power module)
  // No encryption
  if (!rf69.setFrequency(RF69_FREQ)) {
    Serial.println("setFrequency failed");
  }

  // If you are using a high power RF69 eg RFM69HW, you *must* set a Tx power with the
  // ishighpowermodule flag set like this:
  rf69.setTxPower(20, true);  // range from 14-20 for power, 2nd arg must be true for 69HCW

  // The encryption key has to be the same as the one in the server
  uint8_t key[] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08,
                    0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08};
  rf69.setEncryptionKey(key);

  pinMode(A_UP, OUTPUT);
  pinMode(A_DOWN, OUTPUT);
  pinMode(B_UP, OUTPUT);
  pinMode(B_DOWN, OUTPUT);
  pinMode(D_DOWN, OUTPUT);
  pinMode(E_UP, OUTPUT);
  pinMode(E_DOWN, OUTPUT);
  pinMode(F_UP, OUTPUT);
  pinMode(F_DOWN, OUTPUT);

  pinMode(C_1, OUTPUT);
  pinMode(C_2, OUTPUT);
  pinMode(C_3, OUTPUT);

  digitalWrite(A_UP,HIGH);
  digitalWrite(A_DOWN,HIGH);
  digitalWrite(B_UP,HIGH);
  digitalWrite(B_DOWN,HIGH);
  digitalWrite(D_DOWN,HIGH);
  digitalWrite(E_UP,HIGH);
  digitalWrite(E_DOWN,HIGH);
  digitalWrite(F_UP,HIGH);
  digitalWrite(F_DOWN,HIGH);

  digitalWrite(C_1,HIGH);
  digitalWrite(C_2,HIGH);
  digitalWrite(C_3,HIGH);

  Serial.print("RFM69 radio @");  Serial.print((int)RF69_FREQ);  Serial.println(" MHz");
}


void loop() {

 if (rf69.available()) {
    // Should be a message for us now   
    uint8_t buf[RH_RF69_MAX_MESSAGE_LEN];
    uint8_t len = sizeof(buf);
    if (rf69.recv(buf, &len)) {
      if (!len) return;
      buf[len] = 0;
      Serial.println((char*)buf);
      if (strstr((char *)buf, "A UP ON")) {
        digitalWrite(A_UP,LOW);
      }else if (strstr((char *)buf, "A UP OFF")) {
        digitalWrite(A_UP,HIGH);
      }else if (strstr((char *)buf, "A DOWN ON")) {
        digitalWrite(A_DOWN,LOW);
      }else if (strstr((char *)buf, "A DOWN OFF")) {
        digitalWrite(A_DOWN,HIGH);
      }else if (strstr((char *)buf, "B UP ON")) {
        digitalWrite(B_UP,LOW);
      }else if (strstr((char *)buf, "B UP OFF")) {
        digitalWrite(B_UP,HIGH);
      }else if (strstr((char *)buf, "B DOWN ON")) {
        digitalWrite(B_DOWN,LOW);
      }else if (strstr((char *)buf, "B DOWN OFF")) {
        digitalWrite(B_DOWN,HIGH);
      }else if (strstr((char *)buf, "D ON")) {
        digitalWrite(D_DOWN,LOW);
      }else if (strstr((char *)buf, "D OFF")) {
        digitalWrite(D_DOWN,HIGH);
      }else if (strstr((char *)buf, "E UP ON")) {
        digitalWrite(E_DOWN,HIGH);
        digitalWrite(E_UP,LOW);
        delay(3000);
        digitalWrite(E_UP,HIGH);
      }else if (strstr((char *)buf, "E UP OFF")) {
        digitalWrite(E_UP,HIGH);
      }else if (strstr((char *)buf, "E DOWN ON")) {
        digitalWrite(E_UP,HIGH);
        digitalWrite(E_DOWN,LOW);
        delay(3000);
        digitalWrite(E_DOWN,HIGH);
      }else if (strstr((char *)buf, "E DOWN OFF")) {
        digitalWrite(E_DOWN,HIGH);
      }else if (strstr((char *)buf, "F UP ON")) {
        digitalWrite(F_UP,LOW);
      }else if (strstr((char *)buf, "F UP OFF")) {
        digitalWrite(F_UP,HIGH);
      }else if (strstr((char *)buf, "F DOWN ON")) {
        digitalWrite(F_DOWN,LOW);
      }else if (strstr((char *)buf, "F DOWN OFF")) {
        digitalWrite(F_DOWN,HIGH);
      }else if (strstr((char *)buf, "SPEED 0")) {
        digitalWrite(C_1,HIGH);
        digitalWrite(C_2,HIGH);
        digitalWrite(C_3,HIGH);
      }else if (strstr((char *)buf, "SPEED 1")) {
        digitalWrite(C_1,LOW);
        digitalWrite(C_2,HIGH);
        digitalWrite(C_3,HIGH);
      }else if (strstr((char *)buf, "SPEED 2")) {
        digitalWrite(C_1,LOW);
        digitalWrite(C_2,LOW);
        digitalWrite(C_3,HIGH);
      }else if (strstr((char *)buf, "SPEED 3")) {
        digitalWrite(C_1,LOW);
        digitalWrite(C_2,HIGH);
        digitalWrite(C_3,LOW
        );
      }else if (strstr((char *)buf, "SPEED 4")) {
        digitalWrite(C_1,LOW);
        digitalWrite(C_2,LOW);
        digitalWrite(C_3,LOW);
      }

    } else {
      Serial.println("Receive failed");
    }
  }
}
//包含包
#包括
#包括
//定义无线电频率
#定义RF69_FREQ 433.0
//定义输出
#定义一个_UP 13
#定义一个U向下12
#定义B_UP 11
#定义B_向下10
#定义D_向下18
#定义E_UP 9
#定义E_DOWN 6
#定义F_UP 5
#定义F_DOWN 19
#定义C_1 20
#定义C_2 21
#定义C_3 22
//定义无线电引脚
#定义RFM69_CS 8
#定义RFM69_INT 7
#定义RFM69_RST 4
//装载无线电驱动器
RH_RF69 RF69(RFM69_CS,RFM69_INT);
//创建全局变量
int16_t packetnum=0;
无效设置()
{
Serial.begin(9600);
pinMode(RFM69_RST,输出);
数字写入(RFM69,低电平);
Serial.println(“Feather RFM69 RX Test!”);
Serial.println();
//手动复位
数字写入(RFM69_RST,高);
延迟(10);
数字写入(RFM69,低电平);
延迟(10);
如果(!rf69.init()){
Serial.println(“RFM69无线电初始化失败”);
而(1),;
}
Serial.println(“RFM69 radio init OK!”);
//初始化后的默认值为434.0MHz,调制GFSK_Rb250Fd250,+13dbM(用于低功率模块)
//不加密
如果(!rf69.设置频率(rf69_FREQ)){
Serial.println(“设置频率失败”);
}
//如果您使用的是高功率RF69 eg RFM69HW,您*必须*使用
//ishighpowermodule标志设置如下:
rf69.setTxPower(20,true);//功率范围为14-20,69HCW的第二个参数必须为true
//加密密钥必须与服务器中的密钥相同
uint8_t键[]={0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08,
0x01、0x02、0x03、0x04、0x05、0x06、0x07、0x08};
rf69.设置加密密钥(密钥);
pinMode(A_UP,输出);
引脚模式(A_向下,输出);
pinMode(B_UP,输出);
引脚模式(B_向下,输出);
引脚模式(D_向下,输出);
pinMode(E_UP,输出);
引脚模式(E_向下,输出);
pinMode(F_UP,输出);
pinMode(F_向下,输出);
pinMode(C_1,输出);
pinMode(C_2,输出);
pinMode(C_3,输出);
数字写入(A_向上,高);
数字写入(A_向下,高);
数字写入(B_向上,高);
数字写入(B_向下,高);
数字写入(D_向下,高);
数字写入(E_向上,高);
数字写入(E_向下,高);
数字写入(F_UP,高);
数字写入(F_向下,高);
数字写入(C_1,高);
数字写入(C_2,高);
数字写入(C_3,高);
Serial.print(“RFM69无线电”);Serial.print((int)RF69_FREQ);Serial.println(“MHz”);
}
void循环(){
if(rf69.available()){
//现在应该是给我们的信息了
uint8_t buf[右侧RF69_最大消息长度];
uint8_t len=sizeof(buf);
如果(rf69.记录(buf和len)){
如果(!len)返回;
buf[len]=0;
Serial.println((char*)buf);
if(strstr((char*)buf,“A UP ON”)){
数字写入(A_向上,低);
}否则如果(strstr((char*)buf,“A UP OFF”)){
数字写入(A_向上,高);
}否则如果(strstr((char*)buf,“A DOWN ON”)){
数字写入(A_向下,低);
}否则如果(strstr((char*)buf,“A DOWN OFF”)){
数字写入(A_向下,高);
}否则如果(strstr((char*)buf,“B UP ON”)){
数字写入(B_向上,低);
}否则如果(strstr((char*)buf,“B UP OFF”)){
数字写入(B_向上,高);
}否则如果(strstr((char*)buf,“B向下开”)){
数字写入(B_向下,低);
}否则如果(strstr((char*)buf,“B关闭”)){
数字写入(B_向下,高);
}否则如果(strstr((char*)buf,“D ON”)){
数字写入(D_向下,低);
}否则,如果(strstr((char*)buf,“D OFF”)){
数字写入(D_向下,高);
}否则如果(strstr((char*)buf,“E UP ON”)){
数字写入(E_向下,高);
数字写入(E_向上,低);
延迟(3000);
数字写入(E_向上,高);
}否则如果(strstr((char*)buf,“E UP OFF”)){
数字写入(E_向上,高);
}否则如果(strstr((char*)buf,“E向下开”)){
数字写入(E_向上,高);
数字写入(E_向下,低);
延迟(3000);
数字写入(E_向下,高);
}否则,如果(strstr((char*)buf,“E DOWN OFF”)){
数字写入(E_向下,高);
}否则如果(strstr((char*)buf,“F UP ON”)){
数字写入(F_UP,LOW);
}否则如果(strstr((char*)buf,“F UP OFF”)){
数字写入(F_UP,高);
}否则如果(strstr((char*)buf,“F DOWN ON”)){
数字写入(F_向下,低);
}如果(strstr((char*)buf,“F DOWN OFF”)){
数字写入(F_向下,高);
}否则如果(strstr((char*)buf,“速度0”)){
数字写入(C_1,高);
数字写入(C_2,高);
数字写入(C_3,高);
}否则如果(strstr((字符*)buf,“速度1”)){
数字写入(C_1,低);
数字写入(C_2,高);
数字写入(C_3,高);
}否则如果(strstr((字符*)buf,“速度2”)){
数字写入(C_1,低);
数字写入(C_2,低);
数字写入(C_3,高);
}否则如果(strstr((字符*)buf,“速度3”)){
数字写入(C_1,低);
数字写入(C_2,高);
数字写入(C_3,低
);
}否则如果(strstr((字符*)buf,“速度4”)){
数字写入(C_1,低);
数字写入(C_2,低);
数字写入(C_3,低);
}
}否则{
Serial.println(“接收失败”);
}
}
}
<