【问题标题】:Issues sending strings through virtual wire on arduino在 arduino 上通过虚拟线路发送字符串的问题
【发布时间】:2016-04-12 23:59:57
【问题描述】:

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

我有一个 uni 课程的作业,要求我使用廉价的无线电发射器和 [virtualwire library][1] 将数据“包”从一个 arduino 发送到另一个 arduino

我发送的主要数据是从温度/压力传感器读取的。也发送了其他比特和鲍勃,例如发射器的 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 一样(左边是发送,右边是接收)。

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

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

 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 个链接,因此不得不中断一些链接)

【问题讨论】:

  • OK - 所以“二进制”并不意味着其中包含“1”和“0”的字符串。二进制只是意味着使用 int、short、char(意思是 8 位整数)类型 - 而不是字符串。
  • 阿哈尔。所以第一个版本很好!凉豆,谢谢。为我节省了一些工作
  • 好的 - 我会回答的。

标签: arduino radio


【解决方案1】:

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

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

这应该可以简化您的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多