0

我需要正确格式化字符串,以便将其发送到通过串行端口连接的 arduino。例如我有这个 python2.7.5 代码:

x = int(7)
y = int(7000.523)
self.ser.write("%s%s" % (x, y))

但我希望 x 在一个字节中,而 y 在来自 x 的不同字节中,所以我可以为 arduino 代码中的每个接收到的字节分配一个变量,类似于:

for (i=0; i<3; i++) 
  {
   bufferArray[i] = Serial.read();
  } 
d1 = bufferArray[0];
d2 = bufferArray[1];
d3 = bufferArray[2];
x = d1;
y = (d2 << 8) + d3;

换句话说,我不希望 y 的一部分在 x 字节中。执行此操作的正确字符串格式是什么?

4

1 回答 1

1

按照@Mattias Nilsson 的建议,如果您想发送两个连续的 16 位无符号整数,有一个示例代码:

import struct
x = int(7)
y = int(7000.523)
buf = struct.pack("<HH", x, y)
# read it back
for i in buf:
    print "%02x" % (ord(i))

您可以看到它们分别以 2 个字节发送,并且 LSB 字节始终是第一个。(在英特尔 x64 机器 python 2.7.5 上测试) 编辑:您应该能够<在格式字符串的开头使用字符为小端顺序显式设置字节序。

然后你可以使用 Serial.write 发送缓冲区和字符串:

self.ser.write(buf+yourstring+'\0')

您会注意到将终止您的字符串的零字符。如果您像这样发送字符串,则不应在字符串中发送任何零字节字符。

在 arduino 方面,您应该首先读取和解码这两个整数,然后在循环中读取字符,如果您读取零字节,该循环将结束读取。您绝对应该检查您的阅读缓冲区是否也不会溢出。

于 2013-08-04T10:39:43.333 回答