使用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
相关产品推荐
相关产品推荐

