Arduino射频数据传输

时间:2014-12-09 09:59:56

标签: arduino rfcomm

我有3个超声波传感器连接到1个Arduino Uno设备。我想将他们的数据发送到另一个带RF发射器的Arduino Uno。我想发送传感器的ID号(1,2,3)和数据(0或1)。

我想从printDistance方法传输数据,但是传输器发送的消息是char * msg。我只需要发送char值吗?

#include <VirtualWire.h>  

#undef int
#undef abs
#undef double
#undef float
#undef round

//Sonar 1
int echoPin1 =2;
int initPin1 =3;
int distance1 =0;

//Sonar 2
int echoPin2 =6;
int initPin2 =7;
int distance2 =0;

//Sonar 3
//int echoPin3 =8;
//int initPin3 =9;
//int distance3 =0;



void setup() {

        // Initialise the IO and ISR
    vw_set_ptt_inverted(true); // Required for RF Link module
    vw_setup(2000);                 
    vw_set_tx_pin(8);                


  pinMode(initPin1, OUTPUT);
  pinMode(echoPin1, INPUT);
  pinMode(initPin2, OUTPUT);
  pinMode(echoPin2, INPUT);
 // pinMode(initPin3, OUTPUT);
 // pinMode(echoPin3, INPUT);
//  pinMode(initPin4, OUTPUT);
 // pinMode(echoPin4, INPUT);
  delay(2000);
  Serial.begin(9600);
  Serial.println(" ");
}

void loop() {

     const char *msg;    // this is your message to send

   vw_send((uint8_t *)msg, strlen(msg));
   vw_wait_tx();                                          // Wait for message to finish
   delay(200);



  distance1 = getDistance(initPin1, echoPin1);
  printDistance(1, distance2);
  delay(10);

  distance2 = getDistance(initPin2, echoPin2);
  printDistance(2, distance2);
  delay(10);

  //distance3 = getDistance(initPin3, echoPin3);
  //printDistance(3, distance3);
  //delay(10);

 // distance4 = getDistance(initPin4, echoPin4);s
 // printDistance(4, distance4);

  Serial.println(" ");  
  delay(5000);
//  Serial.println(" ");
}

int getDistance (int initPin, int echoPin){

 digitalWrite(initPin, HIGH);
 delayMicroseconds(10); 
 digitalWrite(initPin, LOW); 
 delayMicroseconds(5);
 unsigned long pulseTime = pulseIn(echoPin, HIGH); 
 int distance = pulseTime/58;
 return distance;

}

 void printDistance(int id, int dist){

     Serial.print('<');  

     Serial.print( id );
       Serial.print( '>' );

    if (dist >= 30 || dist <= 0 ){
      Serial.print("0");
    }else {
    Serial.print("1");
    }

     Serial.print('<');

     Serial.print( '/' );

     Serial.print( id );
       Serial.print( '>' );

  //   Serial.println(" ");


 }

2 个答案:

答案 0 :(得分:0)

uint8_t vw_send(uint8_t* buf, uint8_t len)发送一个字节数组,最大长度为77.在C中,字节的类型称为char。在AVR中,它也有一个别名uint8_t

因此,您发送一个字节数组,由您决定如何解释数组中的字符。例如,您可以使用sprintf()将数字写为ascii编码字符串。然后在接收端,你必须使用atoi()从字符串中取回数字。

您也可以选择使用实际数字值填充数组。使用此选项,您必须将整数分解为单独的字节,并在接收端将它们组合在一起。在您的特定情况下,数据已经适合字节,因此您不必这样做。

请注意vw_send((uint8_t *)msg, strlen(msg));无法正常使用第二种方法。 strlen()将计数保持为0的第一个字节,从而有效地截断数组。您只能在使用sprintf()方法时使用此调用。

看起来您正在同时发送所有三个传感器的数据,并且每个传感器的数据都是0或1.为什么不发送0和1的3字节消息?

uint8_t msg[3];

msg[0] = 0;
msg[1] = 1;
msg[2] = 0; // fill these in as you like

vw_send(msg, 3);

答案 1 :(得分:0)

我无法添加代码进行评论。

我改变了代码;

void printDistance(int id, int dist){
     uint8_t msg[1];

if (dist >= 30 || dist <= 0 ){
   msg[0] = 0;
    vw_send(msg, 1);
     //vw_wait_tx(); 

}else {
  msg[0] = 1;
    vw_send(msg, 1);
     //vw_wait_tx(); 

}