为什么VirtualWire似乎接收两次传输?

时间:2017-07-14 17:38:37

标签: arduino

我有一个简单的设置,有两个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;
}

0 个答案:

没有答案