从Processing处理到Arduino的多个整数通过串行库打包/解包
我已成功发送单个的int
值从Processing到Arduino,但现在我需要发送一对ints(两者的值都介于0和90之间),并且I我不知道该怎么做。从Processing处理到Arduino的多个整数通过串行库打包/解包
阅读文档,我看到我可以发送byte/byte[]/int/char/String
类型。 一个想法是发送包含由逗号字符连接的两个整数的字符串,但不是100%确定如何将数据转换为字符串并在Arduino中分割它。
serial.write(intValue1+","+intValue2);
另一件事我想了包装两个整数成byte[]
莫名其妙,但我还没有与字节的工作很多,所以入门的任何提示将是有益的。
如果您要发送整数对或任何数量的字节,似乎您可能需要考虑一个简单的串行协议。有几个问题在这里专门关于嵌入式系统的串行命令协议,例如:
- How do you design a serial command protocol for an embedded system?
- Simple serial point-to-point communication protocol
一个建议是外面开始了你的消息头字节,通常是一些如果可能的话,您的数据范围(在您的案例中> 90)?以下代码尚未经过测试;这只是一个想法,但它应该运行。
int lookingForHeader = 1;
int lookingForByteOne = 0;
int lookingForByteTwo = 0;
while (myPort.available() > 0) {
while (lookingForHeader == 1) {
int header = myPort.read();
if (header == HEADER_BYTE) {
lookingForHeader = 0;
lookingForByteOne = 1;
}
// Consider incrementing a counter here and timing out if it gets too large.
}
if (lookingForByteOne == 1) {
int byteOne = myPort.read();
// Check if byteOne is between 0 and 90.
lookingForByteOne = 0;
lookingForByteTwo = 1;
}
if (lookingForByteTwo == 1) {
int byteTwo = myPort.read();
// Check if byteTwo is between 0 and 90.
lookingforByteTwo = 0;
lookingForHeader = 1;
// Perhaps do a serial.write() here to acknowledge that
// a header and two bytes have been received.
// Finally, do stuff with byteOne and byteTwo.
}
}
另一种选择是,以确认收到每个字节的(即接收报头,具有一个特殊的“ACK报头”字节响应,接收下一个字节,与“ACK字节1”,等等响应)。这很慢,但它可能适合你。
最后,从问题几个关键点I上方连结:
考虑在该消息的末尾发送的校验和(即字节的总和)。 Arduino会将头部,字节1和字节2相加。如果它与校验和不匹配,则它可以响应失败或再次发送消息。
雷克斯的回答问题[2]总结的消息协议可能是什么样子:
// total packet length minus flags len+4
U8 sflag; //0x7e start of packet end of packet flag from HDLC
U8 cmd; //tells the other side what to do.
U8 len; // payload length
U8 payload[len]; // could be zero len
U16 crc;
U8 eflag; //end of frame flag
这是丰富的数据。我对消息协议不太了解,所以这非常方便,谢谢! – 2012-03-04 22:47:03
我希望它有帮助。代码示例将用于处理方面。您需要在Arduino中使用类似的握手代码。最好的办法是写出协议(在纸上),然后在每一边实施。你甚至可以开始小一步,并发送一个两字节的消息 - 一个用于标题,一个用于数据。 – gary 2012-03-05 13:40:41
的声音,我应该尝试以上所有以获得更多的经验。排序的Arduino点,不是吗?在你的代码片段中使用int.ToString()方法,尽管我不认识这种语言。 – 2012-03-03 18:41:19