目标:了解使用相同参数初始化的两个类的奇怪行为,并产生不同的结果。
背景:
我的项目涉及 Raspberry Pi 3 通过串行(通过 USB 端口)通信与 Arduino MEGA 上的各种传感器进行通信。通信协议(protocol)简单。
Raspberry Pi 发送两个字节:
- 传感器的地址(例如
'\x04'
) - 第二个空字节,可以包含其他命令(例如
'\x00'
)
MEGA等待两个字节,然后根据大case/switch
回复请求的信息。树。
我已经用Python封装了处理各种传感器的代码class
es.给我带来麻烦的是 Encoder()
类(class)。这是一个最小的例子:
import serial
class Encoder(object):
def __init__(self, hex_name):
self.hex_name = hex_name
def value(self):
temp = self.hex_name + '\x00'
arduino.write(temp)
return int(arduino.readline())
if __name__ == '__main__':
arduino = serial.Serial('/dev/ttyACMO', 115200)
encoder_one = Encoder('\x03')
encoder_two = Encoder('\x04')
print encoder_one.value()
print encoder_two.value()
Arduino 处理请求如下所示:
if(Serial.available() >= 2){
temp1 = Serial.read();
temp2 = Serial.read();
switch(temp1){
case 1:
...
case 3:
Serial.println(positionLeft);
break;
case 4:
Serial.println(positionRight);
break;
case 5:
...
}
}
问题:
我从编码器中得到了无意义的值。特别令人担忧的是,当我使用相同十六进制名称(即 '\x04'
)初始化两个编码器时,我从 encoder_one.value()
获得不同的值。和encoder_two.value()
.
假设:
- 有关类结构的某些内容有误。
在将其封装到类中之前,我已经正常工作了。我想知道我是否正在分配 encoder_one
和encoder_two
到同一个对象或类似的愚蠢的东西。
我在 return
之前添加了一行在value()
这将打印 hex_name
(即 print self.hex_name
)。当我将两个编码器设置为'\x04'
时我打印了相同的非字母数字字符。当我将一个编码器设置为'\x03'
时另一个为'\x04'
我得到两个不同的非字母数字字符 - 一个是上次测试中的字符。
- 通信中的移帧。
MEGA 需要两个字节。它等待两个字节,发送请求的信息,然后清除缓冲区。是否有可能将十六进制值存储为我的 Python 程序中的字符串,当执行 arduino.write()
时会添加一个额外的字节。像\n
之类的东西或其他不可打印的字符。
结论:
我已经花了大约三个小时来研究这个错误,我认为解决它需要一些关于我不理解的类如何工作的信息。
最佳答案
结果是第二个假设。显然,十六进制字节的连接步骤中包含一些不可打印的字符。切换到以下顺序解决了问题。
编辑:我发现在 write()
之后立即执行 readline()
会出现间歇性错误。我在两个操作之间添加了 10 毫秒的延迟。
旧:
def value(self):
temp = self.hex_name + '\x00'
arduino.write(temp)
return int(arduino.readline())
新:
def value(self):
arduino.write(self.hex_name)
arduino.write('\x00')
time.sleep(0.010)
return int(arduino.readline())
完整的(现在正在运行)示例如下所示。
import serial
class Encoder(object):
def __init__(self, hex_name):
self.hex_name = hex_name
def value(self):
arduino.write(self.hex_name)
arduino.write('\x00')
time.sleep(0.010)
return int(arduino.readline())
if __name__ == '__main__':
arduino = serial.Serial('/dev/ttyACMO', 115200)
encoder_one = Encoder('\x03')
encoder_two = Encoder('\x04')
print encoder_one.value()
print encoder_two.value()
关于python - 使用相同的参数初始化两个Python类,得到不同的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38126546/