从Processing处理到Arduino的多个整数通过串行库打包/解包

从Processing处理到Arduino的多个整数通过串行库打包/解包

问题描述:

我已成功发送单个的int值从Processing到Arduino,但现在我需要发送一对ints(两者的值都介于0和90之间),并且I我不知道该怎么做。从Processing处理到Arduino的多个整数通过串行库打包/解包

阅读文档,我看到我可以发送byte/byte[]/int/char/String类型。 一个想法是发送包含由逗号字符连接的两个整数的字符串,但不是100%确定如何将数据转换为字符串并在Arduino中分割它。

serial.write(intValue1+","+intValue2); 

另一件事我想了包装两个整数成byte[]莫名其妙,但我还没有与字节的工作很多,所以入门的任何提示将是有益的。

+0

的声音,我应该尝试以上所有以获得更多的经验。排序的Arduino点,不是吗?在你的代码片段中使用int.ToString()方法,尽管我不认识这种语言。 – 2012-03-03 18:41:19

如果您要发送整数对或任何数量的字节,似乎您可能需要考虑一个简单的串行协议。有几个问题在这里专门关于嵌入式系统的串行命令协议,例如:

  1. How do you design a serial command protocol for an embedded system?
  2. 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 
+0

这是丰富的数据。我对消息协议不太了解,所以这非常方便,谢谢! – 2012-03-04 22:47:03

+0

我希望它有帮助。代码示例将用于处理方面。您需要在Arduino中使用类似的握手代码。最好的办法是写出协议(在纸上),然后在每一边实施。你甚至可以开始小一步,并发送一个两字节的消息 - 一个用于标题,一个用于数据。 – gary 2012-03-05 13:40:41