在 arduino 上通过虚拟线发送字符串的问题

Issues sending strings through virtual wire on arduino

我对编程还很陌生,遇到了一些实际问题。我在这个问题上呆了几天,所以我想我寻求帮助!

我有一个 uni 课程的作业,要求我使用便宜的无线电发射器和 [virtualwire 库][1]

从一个 arduino 向另一个 arduino 发送 "packet" 数据

我发送的主要数据是从 temperature/pressure 传感器读取的。其他比特和鲍勃也被发送,比如发射器的 ID,这样接收器就知道它是什么(想法是我们都制造一个发射器,它们都可以与 1 个接收器通信,所有发射器都有不同的 ID)

我使用这段代码可以很好地处理十进制:

 Serial.println("Attempting to send....");
  char buff[3];                         
  char fullmsg[11];                     


  sprintf(buff,"%04d",SysID);
  const char *msg0 = buff;
  strcpy(fullmsg, msg0);              

  sprintf(buff,"%04d",NodeID);
  const char *msg1 = buff;
  strcat(fullmsg, msg1);    

  sprintf(buff,"%03d",temp);
  const char *msg2 = buff;
  strcat(fullmsg, msg2);   

  sprintf(buff,"%03d",Pressure);
  const char *msg3 = buff;
  strcat(fullmsg, msg3);

  sprintf(buff,"%d",Switch);
  const char *msg4 = buff;
  strcat(fullmsg, msg4);    

  vw_send((uint8_t *)fullmsg, strlen(fullmsg));  //Sends full message via     virtualwire
  vw_wait_tx();                                 //Waits for message to be sent

  Serial.print(fullmsg) ;
  Serial.println("        ....Sent!");
  delay(100);

该代码工作正常,它发送数据并在另一端接收数据,就像这样http://i.imgur.com/k7W8RFW.png(左边是传输,右边是接收)。

问题是,为了让我们所有的设备协同工作,它们需要发送相同类型的 "packet",并且我们被告知需要以二进制形式发送。 我认为 vw_send 只发送字符数组..? (我对我的术语有点生疏) 所以我需要将我的整数转换成二进制,然后将二进制转换成字符数组来发送它...

所以我使用在这里找到的这段代码转换为二进制文件:

 float temperature;                //define temperature as a float
bmp.getTemperature(&temperature); //assign the value to tempriture
int temp = temperature;
  int t=temp;
  String binarytemp  ("");
    int maskt = 1;
    for(int i = 0; i < 8; i++) // 8 for 8 bit
    {
    if((maskt&t) >= 1)
        binarytemp = "1"+binarytemp;
    else
        binarytemp = "0"+binarytemp;
     maskt<<=1;
    }

我为我的每个变量执行此操作,为我提供 String binarytemp 以及 "binarypressure" 和 "binaryswitch" 等其他变量。所以我必须把它们绑成一根绳子..

  String string1 =  binarynode;     
  String string2 =  binarysys;  
  String string3 =  binarytemp;
  String string4 =  binarypressure;
  String string5 =  binaryswitch;
String FULLMESSAGE =  String(string1 + string2 + string3 + string4 + string5); 

然后我将其转换为 Char 数组并尝试发送它。

char buf [33];
FULLMESSAGE.toCharArray(buf, 33);
                  Serial.print("buf:");
                  Serial.println(buf);
const char *msg = buf;
                  Serial.print("msg:");
                  Serial.println(msg);
vw_send((uint8_t *)msg, strlen(msg));  //Sends full message via virtualwire
 vw_wait_tx(); //wait till the whole thing is sent

出于某种原因,我无法弄清楚它不工作:http://i.imgur.com/fFHjhiy.png 在左侧,它似乎很乐意发送 0 和 1,但正如您在右侧看到的那样,我没有捡起任何东西...

有谁知道为什么会发生这种情况?或者也许只是解决问题的更好方法,我觉得我的有点乱!

我希望我解释得足够好!

完整的发射器代码二进制文件(不工作):http://pastebin.com/n1xCJidJ

完整的十进制发射器代码(有效):http://pastebin.com/avXv8U5D

接收者代码(至少使用十进制...):http://pastebin.com/ELTCfUMz

[1]: https://www.pjrc.com/teensy/td_libs_VirtualWire.html

(抱歉不得不打断一些链接,因为我需要更多的声誉才能添加超过 2 个链接)

我认为你为自己做了太多工作。

单词"binary"并不表示其中包含“1”和“0”的字符串。二进制只是意味着使用 intshortchar(意思是 8 位整数)类型来存储数字 - 而不是字符串。

这应该会简化您的代码。