我有一个简单的设置,有两个Arduinos和一个433MHz的发射器和一个接收器模块。
发射器设置为按下按钮发送一个字符串,该侧正常工作。
在接收器端,我有一个简单的程序,它只是将它接收到的任何内容写入串口:
#include "VirtualWire.h"
int rx_pin = 2;
void setup(){
Serial.begin(9600);
Serial.println("serial ready");
vw_set_rx_pin(rx_pin);
vw_setup(2000);
vw_rx_start();
Serial.println("receiver ready");
}
void loop(){
uint8_t msg[VW_MAX_MESSAGE_LEN];
uint8_t msglen = VW_MAX_MESSAGE_LEN;
vw_wait_rx();
if(vw_get_message(msg, &msglen)){
Serial.print("Got: ");
for (int i = 0; i < msglen; i++)
{
Serial.print(char(msg[i]));
}
Serial.println();
}
}
当我接着监视串行时,接收Arduino似乎每次发送时都会收到两次消息。我使用示波器来验证(据我所知)发射器只发送一次消息,我还尝试将两个Arduinos连接在一起,以确保问题不在于RF模块,我得到了相同的结果。
这让我觉得我的代码或VirtualWire本身存在问题。
我认为我应该以某种方式检查我是否已收到相同的消息,或者我应该清除VirtualWire的缓冲区,我该如何处理?
编辑: 这是发射机代码:
#include "VirtualWire.h"
int tx_pin =2;
int interruptPin = 3;
volatile bool transmitBool = false;
void setup(){
vw_set_tx_pin(tx_pin);
vw_setup(2000);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), transmit, LOW);
pinMode(13, OUTPUT);
digitalWrite(13, LOW);
transmitBool = false;
}
void loop(){
if(transmitBool) {
transmitBool = false;
digitalWrite(13, HIGH);
vw_send((uint8_t *)"abc", 4);
vw_wait_tx();
delay(500);
digitalWrite(13, LOW);
}
}
void transmit() {
transmitBool = true;
}