运行电机时,vw_get_message返回false

时间:2018-03-24 18:47:25

标签: arduino

我第一次使用Arduino,我的项目包括与arduino UNO连接的RF发射器和连接到Arduino Mega的RF接收器。 我尝试从发射器发送数据并使用VirtualWire库在接收器序列上打印,并且每个东西都是这个接收器代码的关键:

#include <VirtualWire.h>

int x=9;
int y=8;
int z=10;
int r=7;

    void setup() 
    {
      Serial.begin(9600);


 pinMode(x,OUTPUT);
 pinMode(y,OUTPUT);
 pinMode(z,OUTPUT);
 pinMode(r,OUTPUT);

 vw_setup(2000); 
 vw_rx_start(); 
    }

    void loop()
    {
        uint8_t buf[VW_MAX_MESSAGE_LEN];
        uint8_t buflen = VW_MAX_MESSAGE_LEN;

        if (vw_get_message(buf, &buflen)) // Non-blocking
        {
        int i;

        // Message with a good checksum received, print it.
        Serial.print("Got: ");

        for (i = 0; i < buflen; i++)
        {
            Serial.print(buf[i], HEX);
            Serial.print(' ');
        }
        Serial.println();

        }
    }

然后我根据重新编写的值添加一些if语句来运行2个电机(连接到x,y,z,r引脚):

       #include <VirtualWire.h>

            int x=9;
            int y=8;
            int z=10;
            int r=7;

                void setup() 
                {
                  Serial.begin(9600);


             pinMode(x,OUTPUT);
             pinMode(y,OUTPUT);
             pinMode(z,OUTPUT);
             pinMode(r,OUTPUT);

             vw_setup(2000); 
             vw_rx_start(); 
                }

                void loop()
                {
                    uint8_t buf[VW_MAX_MESSAGE_LEN];
                    uint8_t buflen = VW_MAX_MESSAGE_LEN;

                    if (vw_get_message(buf, &buflen)) // Non-blocking
                    {
                    int i;

                    // Message with a good checksum received, print it.
                    Serial.print("Got: ");

                    for (i = 0; i < buflen; i++)
                    {

                   if (buf[i]==0x77)//Stop motors
                  {
                    digitalWrite(x,LOW);  
                    digitalWrite(y,LOW);
                    digitalWrite(z,LOW);
                    digitalWrite(r,LOW);


                  }
                  else
                  {
                    if(buf[i]==0x80)//2 motors clockwise
                    {
                      digitalWrite(x,LOW);  
                      digitalWrite(y,HIGH);
                      digitalWrite(z,HIGH);
                      digitalWrite(r,LOW);


                    }

                    if (buf[i]==0x90)//counter clockwise
                    {
                   digitalWrite(x,HIGH);  
                  digitalWrite(y,LOW);
                  digitalWrite(z,LOW);
                  digitalWrite(r,HIGH);

              }
}
}

现在的问题是,当电机停止工作时,我发送的值会以或逆时针方向运行,电机正常工作,但不会响应发送的任何数据。

简而言之,当电机停止工作并且我发送数据时,接收器接收值并运行电动小提琴是必需的,但是例如,如果电机顺时针工作并发送逆时针运行的命令甚至停止工作,它没有回应并继续移动它是。

我注意到,当电机运行此函数时,这会导致错误 vw_get_message(buf,&amp; buflen)

但我不是没有原因!

1 个答案:

答案 0 :(得分:0)

在VirtualWire库中,每次发送新字符或一组字符时,缓冲区都将被覆盖。所以这个程序的问题在于你的for循环检查。如果您只使用以下

,它将正常工作

例如,如果您要发送“A”,“B”等字符,那么

if(vw_get_message(buf,&amp; buflen))     {

  if(buf[0]=='A')
  {
     //move forward
  }
  if(buf[0]=='B')
  {
     //move backward 
  }

....等等

希望这有帮助