在 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”的字符串。二进制只是意味着使用 int
、short
、char
(意思是 8 位整数)类型来存储数字 - 而不是字符串。
这应该会简化您的代码。
我对编程还很陌生,遇到了一些实际问题。我在这个问题上呆了几天,所以我想我寻求帮助!
我有一个 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”的字符串。二进制只是意味着使用 int
、short
、char
(意思是 8 位整数)类型来存储数字 - 而不是字符串。
这应该会简化您的代码。