While loop 代码挂起,同时尝试;而(!radio.available())";反复检查一个接一个的按钮输入

While loop 代码挂起,同时尝试;而(!radio.available())";反复检查一个接一个的按钮输入,while-loop,arduino-uno,While Loop,Arduino Uno,我试图建立一个无线LED控制器使用“nrf24l01”无线模块,我卡住了。我想定期进行连接测试,以确认接收器仍在“那里”。我让代码的这一部分自己工作得很好:我传输,等待收听,接收器响应,连接得到确认。然后,我尝试添加一个按钮按下检查,以在无线测试未运行时运行,同样,单独的按钮测试工作,串行监视器按预期显示按钮按下,但当我尝试一个接一个地执行这两个过程时,代码挂起,在线收听接收器响应-“while(!radio.available());”。我在主循环中调用的单独函数上有两个进程。我对其中一个进行

我试图建立一个无线LED控制器使用“nrf24l01”无线模块,我卡住了。我想定期进行连接测试,以确认接收器仍在“那里”。我让代码的这一部分自己工作得很好:我传输,等待收听,接收器响应,连接得到确认。然后,我尝试添加一个按钮按下检查,以在无线测试未运行时运行,同样,单独的按钮测试工作,串行监视器按预期显示按钮按下,但当我尝试一个接一个地执行这两个过程时,代码挂起,在线收听接收器响应-“while(!radio.available());”。我在主循环中调用的单独函数上有两个进程。我对其中一个进行注释,以单独测试另一个


编辑:看来我的解释可能有点混乱。我会尽量简化:如果我单独运行无线电传输代码(不做任何修改),代码就会工作(发送和接收消息)。如果我在传输代码中添加按钮按下检测部分,传输将冻结(发送消息,但忽略接收任何进一步的响应,即使重复响应)。如果我单独运行按钮并按下部分代码,它就会工作。为什么代码的这两部分相互干扰


为什么变送器挂起或中断是第二个过程?我可以修复代码中的某些内容以使其正常工作,还是有更好的方法来构造代码

任何帮助都将不胜感激,谢谢

变送器代码:

    //Wireless Transmitter
#include <SPI.h>
#include <nRF24L01.h>
#include "RF24.h"

//Wireless RF24 Config
RF24 radio(9, 10);  //previously (7, 8)
const byte Address[][6] = {"1","2"};  //1-write, 2-read

  //Settings--
//System Settings
const long ConnCheckInt = 1000;
const long ListenFor = 5000;
int RadioSetup = 1; //Enable/Disable radio functions 1/0.
const long SystemStart = 1000; //delays time related process startup

  //Test mode settings--
int TestMode = 1; //Serial monitor on/off - 1/0.
int TestDelay = 100; //test mode delay to make sense of the data flow.
int RadioTest = 1;
int IO_Test = 1;
int ButtonTest = 1;

//Connection test variables
int WiFiHandshakeSendCode = 100;
int WiFiHandshakeSuccessCode = 101;
int WiFiHandshakeReceiveCode = 0;
unsigned long ConnStart = 0;
unsigned long ConnCheckAgain = 100;
int RecOfflineCount = 1;
int RecOffAllowed = 20; //how many times in a row can connection fail.
int StateFree = 1;
unsigned long ListenStart = 0;
unsigned long ListenEnd = 0;

//Status LED
int StatusLEDPin = 3;
int StatusLEDTog = 0;
const long StatLEDOnTime = 100;
unsigned long StatLEDStart = 0;

//Delays
int delay1 = 5; //radio delay
int delay2 = 1;

//Inputs
int ChannelIn_1 = 2;  // button
int ChannelIn_1S = 0;
int ChannelIn_1Last = 0;

int InputUpdate = 0;

void setup() {
  if(RadioSetup == 1){
    radio.begin();
    radio.setChannel(115); //Up to 126 channels
    radio.setPALevel(RF24_PA_MAX);
    radio.setDataRate(RF24_250KBPS); //250 is the lowest for best range.
    radio.openWritingPipe(Address[1]);
    radio.openReadingPipe(1, Address[2]);
  }
  if(TestMode == 1){
    Serial.begin(9600);
    Serial.println("Transmitter Start");
  }
  pinMode(2,OUTPUT);
}

void loop() {
  ConnCheck();  // If both ConnCheck and CheckInputs are enabled the Code hangs on tab b_ line 26.
  CheckInputs();  // If either one is commented out, they work fine alone.
}

void ConnCheck(){
  if(millis() >= ConnCheckAgain){
    ConnTest();
    ConnStart = millis();
    ConnCheckAgain = ConnStart + ConnCheckInt + ListenFor;
    if(TestMode == 1 && RadioTest == 1){
      Serial.print("Next Check: ");
      Serial.println(ConnCheckAgain);
    }
  }
}

void ConnTest(){
  if(TestMode == 1 && RadioTest == 1){
    Serial.println("Checking connection... ");
    WiFiHandshakeReceiveCode = 0;
    Serial.print("Read before: ");
    Serial.println(WiFiHandshakeReceiveCode);
  }
  delay(delay1);
  radio.stopListening();
  radio.write(&WiFiHandshakeSendCode, sizeof(WiFiHandshakeSendCode));

  delay(delay1);
  radio.startListening();
  Serial.println("Before hang.");
  while (!radio.available());    // Code hangs here.  <----
  Serial.println("After hang.");
  radio.read(&WiFiHandshakeReceiveCode, sizeof(WiFiHandshakeReceiveCode));

  Serial.print("Read: ");
  Serial.println(WiFiHandshakeReceiveCode);

  if(WiFiHandshakeReceiveCode == WiFiHandshakeSuccessCode){
    RecOfflineCount = 1;
    digitalWrite(StatusLEDPin, LOW);
    StatusLEDTog = 0;
    if(TestMode == 1 && RadioTest == 1){
      Serial.println("Connection Test Complete: ");
      Serial.println("Receiver online.");
    }
    radio.stopListening();
  }

  else{
    if(TestMode == 1 && RadioTest == 1){
      Serial.println("Disconnected");
      radio.stopListening();
    }
    if(RecOfflineCount == RecOffAllowed){
      StatusLEDToggle();
    }
    RecOfflineCount = RecOfflineCount + 1;
  }
}

void CheckInputs(){
  if(StateFree == 1){
    ChannelIn_1S=digitalRead(ChannelIn_1);
    if(ChannelIn_1S == HIGH && ChannelIn_1Last != ChannelIn_1S){
      ChannelIn_1Last = ChannelIn_1S;
      if(ButtonTest == 1){
        InputUpdate = 1;
      }
    }
    else if(ChannelIn_1S == LOW && ChannelIn_1Last != ChannelIn_1S){
      ChannelIn_1Last = ChannelIn_1S;
      if(ButtonTest == 1){
        InputUpdate = 1;
      }
    }
    if(TestMode == 1 && ButtonTest == 1 && InputUpdate == 1){
      Serial.print("Channel 1 Input: ");
      Serial.println(ChannelIn_1S);
      InputUpdate = 0;
    }
  }
}

void StatusLEDToggle(){
  if (StatusLEDTog == 0){
    digitalWrite(StatusLEDPin, HIGH);
    StatusLEDTog = 1;
  }
  else if (StatusLEDTog == 1){
    digitalWrite(StatusLEDPin, LOW);
    StatusLEDTog = 0;
  }
}
//无线发射机
#包括
#包括
#包括“RF24.h”
//无线RF24配置
RF24无线电(9,10)//以前(7,8)
常量字节地址[][6]={“1”,“2”}//一写二读
//背景--
//系统设置
const long conncCheckint=1000;
常量long-listen=5000;
int无线电设置=1//启用/禁用收音机功能1/0。
const long SystemStart=1000//延迟与时间相关的进程启动
//测试模式设置--
int TestMode=1//串行监视器开/关-1/0。
int TestDelay=100//测试模式延迟,以了解数据流。
int放射性试验=1;
内部IO_测试=1;
int ButtonTest=1;
//连接测试变量
int WiFiHandshakeSendCode=100;
int WiFiHandshakeSuccessCode=101;
int WiFiHandshakeReceiveCode=0;
无符号长ConnStart=0;
无符号长循环=100;
int RecOfflineCount=1;
允许的整数=20//连接会连续失败多少次。
int StateFree=1;
无符号长列表开始=0;
无符号长列表nd=0;
//地位领先
int StatusLEDPin=3;
int StatusLEDTog=0;
恒长StatletedonTime=100;
无符号长StatLEDStart=0;
//耽搁
int delay1=5//无线电延迟
int delay2=1;
//投入
int ChannelIn_1=2;//按钮
int ChannelIn_1S=0;
int ChannelIn_1Last=0;
int InputUpdate=0;
无效设置(){
如果(无线电设置==1){
收音机。开始();
radio.setChannel(115);//最多126个频道
收音机设置音量(RF24_PA_MAX);
radio.setDataRate(RF24_250KBPS);//250是最佳范围的最低值。
radio.openWritingPipe(地址[1]);
radio.openReadingPipe(1,地址[2]);
}
if(TestMode==1){
Serial.begin(9600);
Serial.println(“变送器启动”);
}
pinMode(2,输出);
}
void循环(){
ConnCheck();//如果启用了ConnCheck和CheckInputs,代码将挂起在第26行的选项卡b上。
CheckInputs();//如果其中任何一个被注释掉,则它们单独工作正常。
}
无效检查(){
如果(毫秒()>=再次检查){
ConnTest();
ConnStart=millis();
conncCheckReach=ConnStart+conncCheckint+listenc;
if(TestMode==1&&RadioTest==1){
连续打印(“下一次检查:”);
Serial.println(再次检查);
}
}
}
无效测试(){
if(TestMode==1&&RadioTest==1){
Serial.println(“检查连接…”);
WiFiHandshakeReceiveCode=0;
连续打印(“阅读前:”);
Serial.println(WiFiHandshakeReceiveCode);
}
延迟(延迟1);
停止收听;
radio.write(&WiFiHandshakeSendCode,sizeof(WiFiHandshakeSendCode));
延迟(延迟1);
收音机;
序列号.println(“挂起前”);

while(!radio.available());//代码挂起。while(!radio.available());
挂起的原因是您的收发器没有接收到任何东西。请尝试以下方法进行调试:

  • 您可以使用另一个收发器将数据传输到此设备,然后继续测试
  • 您可以使用另一个持续传输数据的Arduino和收发器,或修改代码,使其仅在按下按钮时传输一些数据
  • 在您的情况下,接收器将处于阻塞模式,直到它接收到一些信号。您还可以执行超时以等待一段时间来接收数据,如果没有,则继续执行代码的其他行(您可以打印一条调试消息,说明未接收到信号)

注:我也在看你发布的代码,它看起来不完整,因为我找不到任何关于
TestMode,ButtonTest
正在初始化的引用。

欢迎使用SO。1.并标记一种语言。2.最好在你的问题中发布代码。只有相关的代码。请参阅:如何创建。我已将代码添加到我的pos中t、 我没有足够的技术使它更紧凑,仍然可以工作。希望有人能帮助。Jonny Mopp,所以现在我的问题不会引起任何注意,因为我有一个-1票?:/我不熟悉nrf24l01,但快速查看代码显示它使用SPI。根据,它看起来像SPI使用引脚10的SS。你也在试图告诉我们e.尝试更改:
RF24收音机(7,8);
谢谢Johnny Mopp的推荐。我尝试将PIN切换回7和8。与以前一样,当我添加按键检测时,代码的传输部分单独工作
    // Upon Button Press
    const char text[] = "Hello World";
    radio.write(&text, sizeof(text));