You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Adafruit Feather 32u4 LoRa制作摩尔斯发射机按键无响应如何解决

问题现象

我尝试用AtMega 32u4制作摩尔斯电码发射机,单片机无法识别输入按键。使用的硬件为Adafruit Feather 32u4 LoRa发射板,目标是制作一台数字摩尔斯发射机,传输部分代码引自网络,其余逻辑为自行编写。目前两台收发器之间可以正常互相传输数据,但单片机始终无法识别输入按键。

核心loop代码
int StatoPrecP2 = 0;
int i;
char SendData;
void loop()
{
  switch (Stato) {
      StatoAttP1 = digitalRead(P_Riga);
      StatoAttP2 = digitalRead (P_Punto);
    case 0:

      if (StatoAttP1 == 1) /*&& (StatoPrecP1 != StatoAttP1 )) */{
        digitalWrite(ButtonRecived, HIGH);
        delay (250);
        digitalWrite(ButtonRecived, LOW);
        Stato = 1;
        SendData = ".";
      }
      if ((StatoAttP2 == 1) && (StatoPrecP2 != StatoAttP1)) {
        digitalWrite(ButtonRecived, 1);
        delay (250);
        digitalWrite(ButtonRecived, 0);
        Stato = 1;
        SendData = "-";
      }
      if (rf95.available())
      {
        // Should be a message for us now
        uint8_t buf[RH_RF95_MAX_MESSAGE_LEN];
        uint8_t len = sizeof(buf);

        if (rf95.recv(buf, &len))
        {
          digitalWrite(LED, HIGH);
          RH_RF95::printBuffer("Received: ", buf, len);
          Serial.print("Got: ");
          Serial.println((char*)buf);
          Serial.print("RSSI: ");
          Serial.println(rf95.lastRssi(), DEC);
          if (*buf = ".") {
            PORTF = PORTF | 0x20;
            delay(1000);
            PORTF = PORTF & ~0x20;
          }
          else if (*buf = "-") {
            PORTF = PORTF | 0x20;
            delay(2500);
            PORTF = PORTF & ~0x20;
          }
        }
        else
        {
          Serial.println("Receive failed");
        }
      case 1:
        // Send a reply
        for (i = 0; i < 5000; i++) {
          uint8_t data = SendData;
          rf95.send(data, sizeof(data));
          rf95.waitPacketSent();
          Serial.println("Sent a reply");
          digitalWrite(LED, LOW);

          if ((StatoAttP1 = 1) & (StatoAttP1 != StatoPrecP1)) {
            PORTF = PORTF | 0x10;
            delay (250);
            PORTF = PORTF & ~0x10;
            Stato = 1;
            uint8_t data[] = ".";
            i = 0;
          }
          else if ((StatoAttP2 = 1) & (StatoAttP2 != StatoPrecP2)) {
            PORTF = PORTF | 0x10;
            delay (250);
            PORTF = PORTF & ~0x10;
            Stato = 1;
            uint8_t data[] = "-";
            i = 0;
          }
          delay (1);
        }  
        Stato = 0;
      }
  }
      StatoPrecP1 = StatoAttP1;
      StatoPrecP2 = StatoAttP2;
}
问题原因与修复方案

1. switch结构逻辑错误

  • 读取按键电平的StatoAttP1 = digitalRead(P_Riga);、StatoAttP2 = digitalRead (P_Punto);两行代码放在了switch内部、case 0之前,属于switch语法中的死区代码,永远不会被执行,按键电平从未被正确读取,因此无法识别按键。
  • 修复:将两行按键读取代码移到switch(Stato)之前,或者放在case 0的最开头位置。

2. 按键判断逻辑错误

  • 第二个按键的判断条件错误和第一个按键的电平比较:StatoPrecP2 != StatoAttP1,需改为StatoPrecP2 != StatoAttP2。
  • case1内的按键判断混用了赋值运算符=和比较运算符==、按位与&和逻辑与&&,需改为if ((StatoAttP1 == 1) && (StatoAttP1 != StatoPrecP1)),第二个按键的判断同理修改。

3. 语法混用错误

  • 给字符变量SendData赋值时使用了字符串常量标记".",需改为单引号标记的字符常量'.'。
  • 接收逻辑的if (*buf = ".")同时存在赋值运算符误用、字符串和字符混用问题,需改为if (*buf == '.')。

4. LoRa调用参数错误

  • rf95.send的第一个入参要求为数据指针,直接传入字符变量data会触发内存访问错误,需改为rf95.send(&data, sizeof(data))。

5. 基础配置检查

  • 确认代码中用到的Stato、StatoAttP1、P_Riga、P_Punto、ButtonRecived等变量已提前声明,按键引脚在setup函数中已配置为INPUT或INPUT_PULLUP模式,若使用外部下拉电路需对应调整电平判断逻辑。

内容的提问来源于stack exchange,提问作者Maki Samuel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.22 01:06:03