【发布时间】: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 位整数)类型 - 而不是字符串。
-
阿哈尔。所以第一个版本很好!凉豆,谢谢。为我节省了一些工作
-
好的 - 我会回答的。